ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0Ly5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYzRjODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiNDExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjIwdGggSnVuZSwgMjAwMjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+Q29udHJpYnV0aW9uczwvaDM+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBDUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQotbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZSBob3N0IG9mIEVjbGlwc2Uub3JnIHdlYiBzaXRlLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaAotQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDUEwuPC9wPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3RoZXIgdGhhbiB0aGUgQ1BMICgmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7KSwgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3IKLW90aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gKCZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDspIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlCi1ob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlCi10byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbwotcHJvdmlkaW5nIHRoZSBNb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBzdWNoIE1vZGlmaWNhdGlvbnMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBDUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXQvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYmQ2ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXM9ZnJhZ21lbnQueG1sLGFib3V0Lmh0bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdC9mcmFnbWVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdC9mcmFnbWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZThlZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXQvZnJhZ21lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmcmFnbWVudAotICAgaWQ9Im9yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdCIKLSAgIG5hbWU9Ikp1bml0IEZyYWdtZW50IgotICAgdmVyc2lvbj0iMi4xLjAiCi0gICBwbHVnaW4taWQ9Im9yZy5hcGFjaGUuYW50IgotICAgcGx1Z2luLXZlcnNpb249IjEuNC4xIj4KLQotICAgPHJ1bnRpbWU+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y4NjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWYyMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzXzMuMC4wLnppcAotcmVsZW5ndGVzdHNzcmMuemlwCi1idWlsZC54bWwKLXJlbGVuZ3Rlc3RzLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzNmRlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnJlbGVuZy50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGI0MTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MjB0aCBKdW5lLCAyMDAyPC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Db250cmlidXRpb25zPC9oMz4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIENQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwYTY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi54bWwsXAotICAgICAgICAgICAgICAgKi50eHQsXAotICAgICAgICAgICAgICAgKi5leGUsXAotICAgICAgICAgICAgICAgKi5qYXIKLQotc291cmNlLnJlbGVuZ3Rlc3RzLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzL2lnbm9yZUVycm9yc1VuaXgudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvaWdub3JlRXJyb3JzVW5peC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvaWdub3JlRXJyb3JzVW5peC50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvaWdub3JlRXJyb3JzV2luZG93cy50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9pZ25vcmVFcnJvcnNXaW5kb3dzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4ODU2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9pZ25vcmVFcnJvcnNXaW5kb3dzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotMTI3Ci0xMjgKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzL2lnbm9yZUZpbGVzLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzL2lnbm9yZUZpbGVzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2NTU1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9pZ25vcmVGaWxlcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1mZWF0dXJlLnByb3BlcnRpZXMKLWZlYXR1cmUueG1sCi1jcGwqLmh0bWwKLWxpY2Vuc2UuaHRtbAotbm90aWNlLmh0bWwKLSovLm1ldGFkYXRhLy5jYWNoZS5wcm9wZXJ0aWVzCi0qL2RvY196aXAvcmVmZXJlbmNlL2FwaS8qCi0qL2RvY196aXAvcmVmZXJlbmNlL29zZ2kvKgotKi9vcmcuYXBhY2hlLmFudF8qCi0qL3hlcmNlc0ltcGxfamFyLyoKLSoveGVyY2Vzc3JjX3ppcC8qCi0qL3BsdWdpbnMvb3JnLmVjbGlwc2UudWlfKi9wbHVnaW4ueG1sCi0qL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XyovY29uZi8qCi0qL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XyovY2F0YWxpbmFfamFyLyoKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS50b21jYXRfKi9qYXNwZXItcnVudGltZV9qYXIvKgotKi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF8qL3RvbWNhdC11dGlsX2phci8qCi0qL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XyovY29tbW9ucy1kaWdlc3Rlcl9qYXIvKgotKi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF8qL25hbWluZy1jb21tb25famFyLyoKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS50b21jYXRfKi9uYW1pbmctcmVzb3VyY2VzX2phci8qCi0qL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0Xyovc2VydmxldHMtY29tbW9uX2phci8qCi0qL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XyovdG9tY2F0LWNveW90ZV9qYXIvKgotKi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF8qL3RvbWNhdC1odHRwMTFfamFyLyoKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS50b21jYXRfKi9jb21tb25zLWJlYW51dGlsc19qYXIvKgotKi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF8qL2NvbW1vbnMtbW9kZWxlcl9qYXIvKgotKi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF8qL2phc3Blci1ydW50aW1lX2phci8qCi0qL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XyovdG9tY2F0LXV0aWxfamFyLyoKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS50b21jYXRfKi9jb21tb25zLWxvZ2dpbmdfamFyLyoKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS50b21jYXRfKi9zZXJ2bGV0X2phci8qCi0qL29yZy5hcGFjaGUubHVjZW5lXyovbHVjZW5lLSotc3JjX3ppcC9sdWNlbmUtKi1zcmMvKgotKi9wbHVnaW5zL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZV8qL3NyYy9vcmcuYXBhY2hlLmx1Y2VuZV8qL2x1Y2VuZS0qLXNyY196aXAvbHVjZW5lLSovKgotKi9wbHVnaW5zL29yZy5lY2xpcHNlLmpkdC51aV8qL2pkdF9qYXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmV4dC90ZW1wbGF0ZS9kZWZhdWx0LWNvZGV0ZW1wbGF0ZXMueG1sCi0qL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50LnVpXyovYW50dWlfamFyL2FudHRhc2tzXyoueG1sCi0qL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50LnVpXyovYW50dWlfamFyL1hET0N0YXNrcy54bWwKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuYnVpbGRfKi9zY3JpcHRzLyoKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuYnVpbGRfKi9mZWF0dXJlLyoKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuYnVpbGRfKi9ub3Rlcy8qCi0qL3BsdWdpbnMvb3JnLmVjbGlwc2UucGRlLnVpXyovdGVtcGxhdGVzKi9oZWxwL3RvYy54bWwKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS5oZWxwLndlYmFwcF8qL1dFQi1JTkYvd2ViLnhtbAotKi9wbHVnaW5zL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaF8qL3dvcmtiZW5jaC1uZXdfamFyL3NjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbAotKi9wbHVnaW5zL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaF8qL3RleHRlZGl0b3ItbmV3X2phci9zY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS5qZmFjZV8qL2pmYWNlLW5ld19qYXIvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sCi0qL3BsdWdpbnMvb3JnLmVjbGlwc2UuamR0Xyovb3ZlcnZpZXdFeHRlbnNpb25Db250ZW50LnhtbAotKi9wbHVnaW5zL29yZy5lY2xpcHNlLmpkdF8qL3NhbXBsZXNFeHRlbnNpb25Db250ZW50LnhtbAotKi9wbHVnaW5zL29yZy5lY2xpcHNlLmpkdF8qL3R1dG9yaWFsc0V4dGVuc2lvbkNvbnRlbnQueG1sCi0qL3BsdWdpbnMvb3JnLmVjbGlwc2UuamR0XyovY2hlYXRzaGVldHMvSGVsbG9Xb3JsZC54bWwKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS5qZHRfKi9jaGVhdHNoZWV0cy9IZWxsb1dvcmxkU1dULnhtbAotKi9wbHVnaW5zL29yZy5lY2xpcHNlLnBkZV8qL292ZXJ2aWV3RXh0ZW5zaW9uQ29udGVudC54bWwKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS5wZGVfKi90dXRvcmlhbHNFeHRlbnNpb25Db250ZW50LnhtbAotKi9wbHVnaW5zL29yZy5lY2xpcHNlLnBkZV8qL2NoZWF0c2hlZXRzL2hlbGxvd29ybGQueG1sCi0qL3BsdWdpbnMvb3JnLmVjbGlwc2UucGRlXyovY2hlYXRzaGVldHMvdXBkYXRlcy54bWwKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS5wbGF0Zm9ybV8qL2ludHJvQ29udGVudC54bWwKLSovcGx1Z2lucy9vcmcuZWNsaXBzZS5wbGF0Zm9ybV8qL2NoZWF0c2hlZXRzL0NWU18xLnhtbAotKi9wbHVnaW5zL29yZy5lY2xpcHNlLmpkdF8qL25ld3NFeHRlbnNpb25Db250ZW50LnhtbAotKi9wbHVnaW5zL29yZy5lY2xpcHNlLnBkZV8qL25ld3NFeHRlbnNpb25Db250ZW50LnhtbCAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9ub3Rlcy50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9ub3Rlcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYWRlYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvbm90ZXMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1JbiBvcmRlciBmb3IgdGhlIHRlc3RDaGtwaWkgYXV0b21hdGVkIHRlc3QgdG8gcnVuIHlvdSBtdXN0IGhhdmUKLXRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIGludGVybmFsIElCTSBjaGtwaWkgdG9vbHMgb24geW91cgotcGF0aCBhbmQgdGhlIGZpbGUgbXVzdCBiZSBjYWxsZWQgY2hrcHc2MDQuZXhlCi0KLUFsc28sIGluIFVuaXggc3lzdGVtIGNoa3BpaSBjaG9rZXMgaWYgeW91IGhhdmUgZXJyb3JzIDEyNyBhbmQgMTI4Ci1pbiB5b3VyIGlnbm9yZUVycm9ycy50eHQgZmlsZQotCi1BbHNvLCB5b3UgbXVzdCB1c2UgdGhlIGNvcnJlY3QgcGxhdGZvcm0gZmlsZSBzZXBlcmF0b3IgaW4gdGhlCi1pZ25vcmVGaWxlcy50eHQuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljY2NiNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzIgotICAgbmFtZT0iRWNsaXBzZSBSZWxlbmcgVGVzdHMiCi0gICB2ZXJzaW9uPSIzLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIj4KLSAgIAotPHJlcXVpcmVzPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ii8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZSAiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KLTwvcmVxdWlyZXM+Ci0KLTxydW50aW1lPgotICAgPGxpYnJhcnkgbmFtZT0icmVsZW5ndGVzdHMuamFyIi8+Ci08L3J1bnRpbWU+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90ZXN0cy9CdWlsZFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rlc3RzL0J1aWxkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjMTJjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rlc3RzL0J1aWxkVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnJlbGVuZy50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci0vL2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBCdWlsZFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXByaXZhdGUgTGlzdCBjb3B5cmlnaHRFeGNsdWRlRGlyZWN0b3JpZXM7Ci0JcHJpdmF0ZSBMaXN0IGN2c0V4Y2x1ZGVEaXJlY3RvcmllczsKLQlwcml2YXRlIFN0cmluZyBzb3VyY2VEaXJlY3RvcnlOYW1lOwotCXByaXZhdGUgU3RyaW5nIGxvZ0ZpbGVOYW1lOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfS08gPSAiLWtvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0tLViA9ICIta2t2IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0tCID0gIi1rYiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19CSU5BUlkgPSAiQ1ZTX0JJTkFSWSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOVFJZX1RZUEVfSU5ERVggPSAzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTlRSWV9OQU1FX0lOREVYID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VOVFJZX0ZJRUxEU19TSVpFID0gNDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DVlNfVFlQRSA9ICIta2t2IjsKLQkKLQlwcml2YXRlIE1hcCBjdnNUeXBlczsKLQlwcml2YXRlIExpc3QgY3ZzRGlyZWN0b3J5VHlwZXM7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBqYXZhQ29weXJpZ2h0TGluZXM7Ci0JcHJpdmF0ZSBsb25nIGdvb2RDb3B5cmlnaHRzID0gMDsKLQlwcml2YXRlIGxvbmcgYmFkQ29weXJpZ2h0cyA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUTUwgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWE1MID0gMjsKLQkKLQlwcml2YXRlIHN0YXRpYyBGaWxlVG9vbC5JWmlwRmlsdGVyIGdldFRydWVGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRmlsZVRvb2wuSVppcEZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHNob3VsZEV4dHJhY3QoU3RyaW5nIGZ1bGxFbnRyeU5hbWUsIFN0cmluZyBlbnRyeU5hbWUsIGludCBkZXB0aCkge3JldHVybiB0cnVlO30KLQkJCXB1YmxpYyBib29sZWFuIHNob3VsZFVuemlwKFN0cmluZyBmdWxsRW50cnlOYW1lLCBTdHJpbmcgZW50cnlOYW1lLCBpbnQgZGVwdGgpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIGhhc0Vycm9ycy4KLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc0Vycm9ycyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlCdWZmZXJlZFJlYWRlciBhUmVhZGVyID0gbnVsbDsKLQkJCi0JCXRyeSB7Ci0JCQlhUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKHN0cmluZykpKTsKLQkJCVN0cmluZyBhTGluZSA9IGFSZWFkZXIucmVhZExpbmUoKTsKLQkJCXdoaWxlIChhTGluZSAhPSBudWxsKSB7Ci0JCQkJaW50IGFOdW1iZXIgPSBwYXJzZUxpbmUoYUxpbmUpOwotCQkJCWlmIChhTnVtYmVyID4gMCkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0KLQkJCQlhTGluZSA9IGFSZWFkZXIucmVhZExpbmUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IG9wZW4gbG9nIGZpbGU6ICIgKyBzdHJpbmcpOwotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciByZWFkaW5nIGxvZyBmaWxlOiAiICsgc3RyaW5nKTsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYVJlYWRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYVJlYWRlci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYm9ndXNUZXN0Q29weXJpZ2h0KCkgeyAgLy8gTm90IHJlYWR5IGZvciBwcmltZXRpbWUgeWV0LgotCQkKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW5pdGlhbGl6ZUphdmFDb3B5cmlnaHQoKTsKLQkJCi0JCW5ldyBGaWxlKGxvZ0ZpbGVOYW1lKS5ta2RpcnMoKTsKLQkJbG9nRmlsZU5hbWUgPSBsb2dGaWxlTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgImNvcHlyaWdodExvZy50eHQiOwotCi0JCXRyeSB7Ci0JCQlCdWZmZXJlZFdyaXRlciBhTG9nID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGxvZ0ZpbGVOYW1lKSk7Ci0JCQlGaWxlIHJvb3REaXJlY3RvcnkgPSBuZXcgRmlsZShzb3VyY2VEaXJlY3RvcnlOYW1lKTsKLQkJCXJlc3VsdCA9IHNjYW5Db3B5cmlnaHRzKHJvb3REaXJlY3RvcnksIGFMb2cpOwotCQkJYUxvZy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIGNvcHlyaWdodHM6ICIgKyAoZ29vZENvcHlyaWdodHMgKyBiYWRDb3B5cmlnaHRzKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiR29vZCBjb3B5cmlnaHRzOiAiICsgZ29vZENvcHlyaWdodHMpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJhZCBjb3B5cmlnaHRzOiAiICsgYmFkQ29weXJpZ2h0cyk7Ci0JCQotCQlhc3NlcnRGYWxzZSgiQ29weXJpZ2h0IGVycm9ycy4gIFNlZSB0aGUgcmVsZW5nIHRlc3QgbG9ncyBsaW5rZWQgZnJvbSB0aGUgdGVzdCByZXN1bHRzIHBhZ2UgZm9yIGRldGFpbHMuIiwgcmVzdWx0KTsKLQl9Ci0KLQotCQotCS8qKgotCSAqIEBwYXJhbSByb290RGlyZWN0b3J5Ci0JICogQHBhcmFtIGFMb2cKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2NhbkNvcHlyaWdodHMoRmlsZSBhRGlyZWN0b3J5LCBCdWZmZXJlZFdyaXRlciBhTG9nKSB7Ci0JCQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkKLQkJaWYgKGlzQ29weXJpZ2h0RXhjbHVkZURpcmVjdG9yeShhRGlyZWN0b3J5KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJRmlsZVtdIGZpbGVzID0gYURpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQkJCi0JCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gZmlsZXNbaV07Ci0JCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCXJlc3VsdCA9IHJlc3VsdCB8IHNjYW5Db3B5cmlnaHRzKGFGaWxlLCBhTG9nKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0IHwgdmFsaWRhdGVDb3B5cmlnaHQoYUZpbGUsIGFMb2cpOzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCB6dGVzdENWU0tUYWcoKSB7Ci0JCQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbml0aWFsaXplQ1ZTVHlwZXMoKTsKLQkJbmV3IEZpbGUobG9nRmlsZU5hbWUpLm1rZGlycygpOwotCQlsb2dGaWxlTmFtZSA9IGxvZ0ZpbGVOYW1lICsgRmlsZS5zZXBhcmF0b3IgKyAiY3ZzVHlwZXNMb2cudHh0IjsKLQkJCQotCQl0cnkgewotCQkJQnVmZmVyZWRXcml0ZXIgYUxvZyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihsb2dGaWxlTmFtZSkpOwotCQkJRmlsZSByb290RGlyZWN0b3J5ID0gbmV3IEZpbGUoc291cmNlRGlyZWN0b3J5TmFtZSk7Ci0JCQlyZXN1bHQgPSBzY2FuQ1ZTS1RhZyhyb290RGlyZWN0b3J5LCBhTG9nKTsKLQkJCWFMb2cuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJYXNzZXJ0RmFsc2UoIkNWUyBLVGFnIHR5cGUgZXJyb3JzLiAgU2VlIHRoZSByZWxlbmcgdGVzdCBsb2dzIGxpbmtlZCBmcm9tIHRoZSB0ZXN0IHJlc3VsdHMgcGFnZSBmb3IgZGV0YWlscy4iLCByZXN1bHQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNWU1R5cGVzKCkgewotCQljdnNUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWN2c0RpcmVjdG9yeVR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQljdnNFeGNsdWRlRGlyZWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkKLQkJY3ZzVHlwZXMucHV0KCJnaWYiLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJqcGciLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJ6aXAiLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJqYXIiLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJibXAiLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJjbGFzcyIsIENWU19CSU5BUlkpOwotCQljdnNUeXBlcy5wdXQoImRsbCIsIENWU19CSU5BUlkpOwotCQljdnNUeXBlcy5wdXQoImRvYyIsIENWU19CSU5BUlkpOwotCQljdnNUeXBlcy5wdXQoImV4ZSIsIENWU19CSU5BUlkpOwotCQljdnNUeXBlcy5wdXQoImljbyIsIENWU19CSU5BUlkpOwotCQljdnNUeXBlcy5wdXQoImpwZWciLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJwZGYiLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJwbmciLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJwcHQiLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJzbyIsIENWU19CSU5BUlkpOwotCQljdnNUeXBlcy5wdXQoInRpZmYiLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJ0aWYiLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJ4bHMiLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJyc2MiLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJqbmlsaWIiLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJhIiwgQ1ZTX0JJTkFSWSk7Ci0JCWN2c1R5cGVzLnB1dCgic2wiLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJhIiwgQ1ZTX0JJTkFSWSk7Ci0JCWN2c1R5cGVzLnB1dCgiMSIsIENWU19CSU5BUlkpOwotCQljdnNUeXBlcy5wdXQoInhwbSIsIENWU19CSU5BUlkpOwotCQljdnNUeXBlcy5wdXQoImEiLCBDVlNfQklOQVJZKTsKLQkJY3ZzVHlwZXMucHV0KCJwbSIsIENWU19CSU5BUlkpOwotCi0JCS8vIERlZmluZSBkaXJlY3RvcmllcyB3aXRoIGFsbCBiaW5hcnkgdHlwZXMJCi0JCWN2c0RpcmVjdG9yeVR5cGVzLmFkZCgib3JnLmVjbGlwc2UuamR0LnVpLnRlc3RzLnJlZmFjdG9yaW5nIiArIEZpbGUuc2VwYXJhdG9yICsgInJlc291cmNlcyIpOwotCQkKLQkJLy8gRGVmaW5lIGV4Y2x1ZGUgZGlyZWN0b3JpZXMKLQkJY3ZzRXhjbHVkZURpcmVjdG9yaWVzLmFkZCgib3JnLmVjbGlwc2UuamR0LnVpLnRlc3RzLnJlZmFjdG9yaW5nIiArIEZpbGUuc2VwYXJhdG9yICsgInJlc291cmNlcyIpOwotCQljdnNFeGNsdWRlRGlyZWN0b3JpZXMuYWRkKCJwbGF0Zm9ybS1sYXVuY2hlciIpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplSmF2YUNvcHlyaWdodCgpIHsKLQkJY29weXJpZ2h0RXhjbHVkZURpcmVjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWphdmFDb3B5cmlnaHRMaW5lcyA9IG5ldyBTdHJpbmdbOF07Ci0JCWphdmFDb3B5cmlnaHRMaW5lc1swXT0iLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiOwotCQlqYXZhQ29weXJpZ2h0TGluZXNbMV09IiAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4iOwotCQlqYXZhQ29weXJpZ2h0TGluZXNbMl09IiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgIjsKLQkJamF2YUNvcHlyaWdodExpbmVzWzNdPSIgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMCI7Ci0JCWphdmFDb3B5cmlnaHRMaW5lc1s0XT0iICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQiOwotCQlqYXZhQ29weXJpZ2h0TGluZXNbNV09IiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIjsKLQkJamF2YUNvcHlyaWdodExpbmVzWzZdPSIgKiAiOwotCQlqYXZhQ29weXJpZ2h0TGluZXNbN109IiAqIENvbnRyaWJ1dG9yczoiOwotCQkKLQkJLy8gRGVmaW5lIGRpcmVjdG9yaWVzIHdpdGggYWxsIGJpbmFyeSB0eXBlcwkKLQkJY29weXJpZ2h0RXhjbHVkZURpcmVjdG9yaWVzLmFkZCgib3JnLmVjbGlwc2UuamR0LnVpLnRlc3RzLnJlZmFjdG9yaW5nIiArIEZpbGUuc2VwYXJhdG9yICsgInJlc291cmNlcyIpOwotCQljb3B5cmlnaHRFeGNsdWRlRGlyZWN0b3JpZXMuYWRkKCJvcmcuZWNsaXBzZS5qZHQuZGVidWcudGVzdHMiICsgRmlsZS5zZXBhcmF0b3IgKyAicmVzb3VyY2VzIik7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNjYW5DVlNLVGFnKEZpbGUgYURpcmVjdG9yeSwgQnVmZmVyZWRXcml0ZXIgYUxvZykgewotCQkKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCi0JCWlmIChpc0N2c0V4Y2x1ZGVEaXJlY3RvcnkoYURpcmVjdG9yeSkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCUZpbGVbXSBmaWxlcyA9IGFEaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCQotCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IGZpbGVzW2ldOwotCQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlpZiAoYUZpbGUuZ2V0TmFtZSgpLmVxdWFscygiQ1ZTIikpIHsKLQkJCQkJcmVzdWx0ID0gcmVzdWx0IHwgc2NhbkNWU0RpcmVjdG9yeShhRmlsZSwgYUxvZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gcmVzdWx0IHwgc2NhbkNWU0tUYWcoYUZpbGUsIGFMb2cpOwotCQkJCX0gCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFEaXJlY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3ZzRXhjbHVkZURpcmVjdG9yeShGaWxlIGFEaXJlY3RvcnkpIHsKLQkJU3RyaW5nIGFTdHJpbmcgPSBhRGlyZWN0b3J5LmdldFBhdGgoKS5zdWJzdHJpbmcoc291cmNlRGlyZWN0b3J5TmFtZS5sZW5ndGgoKSkudG9Mb3dlckNhc2UoKTsKLQkJSXRlcmF0b3IgYW5JdGVyYXRvciA9IGN2c0V4Y2x1ZGVEaXJlY3Rvcmllcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoYW5JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhbkl0ZW0gPSAoU3RyaW5nKSBhbkl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChhU3RyaW5nLmluZGV4T2YoYW5JdGVtKSAhPSAtMSkgewotCQkJCXJldHVybiB0cnVlOyAKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhRGlyZWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NvcHlyaWdodEV4Y2x1ZGVEaXJlY3RvcnkoRmlsZSBhRGlyZWN0b3J5KSB7Ci0JCVN0cmluZyBhU3RyaW5nID0gYURpcmVjdG9yeS5nZXRQYXRoKCkuc3Vic3RyaW5nKHNvdXJjZURpcmVjdG9yeU5hbWUubGVuZ3RoKCkpLnRvTG93ZXJDYXNlKCk7Ci0JCUl0ZXJhdG9yIGFuSXRlcmF0b3IgPSBjb3B5cmlnaHRFeGNsdWRlRGlyZWN0b3JpZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFuSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgYW5JdGVtID0gKFN0cmluZykgYW5JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoYVN0cmluZy5pbmRleE9mKGFuSXRlbSkgIT0gLTEpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsgCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gc2NhbkNWU0RpcmVjdG9yeShGaWxlIGFEaXJlY3RvcnksIEJ1ZmZlcmVkV3JpdGVyIGFMb2cpIHsKLQkJCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQotCQlGaWxlIGVudHJpZXMgPSBuZXcgRmlsZShhRGlyZWN0b3J5LCAiRW50cmllcyIpOwotCQl0cnkgewotCQkJQnVmZmVyZWRSZWFkZXIgYVJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihlbnRyaWVzKSk7Ci0JCQlTdHJpbmcgYUxpbmUgPSBhUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQl3aGlsZSAoYUxpbmUgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHJlc3VsdCB8IHZhbGlkYXRlQ1ZTRW50cnkoYURpcmVjdG9yeS5nZXRQYXJlbnRGaWxlKCksIGFMaW5lLCBhTG9nKTsKLQkJCQlhTGluZSA9IGFSZWFkZXIucmVhZExpbmUoKTsKLQkJCX0KLQkJCQotCQkJYVJlYWRlci5jbG9zZSgpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIE5vdCBGb3VuZCByZWFkaW5nIEVudHJpZXMgZmlsZSIpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJT0V4Y2VwdGlvbiByZWFkaW5nIEVudHJpZXMgZmlsZSIpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQkJCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFGaWxlCi0JICogQHJldHVybiBib29sZWFuIC0gdHJ1ZSBpZiB0aGUgY29weXJpZ2h0IGlzIE5PVCB2YWxpZC4KLQkgKi8JCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlQ29weXJpZ2h0KEZpbGUgYUZpbGUsIEJ1ZmZlcmVkV3JpdGVyIGFMb2cpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCi0JCWlmICghYUZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamF2YSIpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlMaW5lTnVtYmVyUmVhZGVyIGFSZWFkZXI7Ci0JCXRyeSB7Ci0JCQlhUmVhZGVyID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IEZpbGVSZWFkZXIoYUZpbGUpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YUNvcHlyaWdodExpbmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGFMaW5lID0gYVJlYWRlci5yZWFkTGluZSgpOwotCQkJCWlmIChhTGluZSA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoaSA+IC0xKSB7Ci0JCQkJCWlmICghYUxpbmUudHJpbSgpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGphdmFDb3B5cmlnaHRMaW5lc1tpXS50cmltKCkudG9Mb3dlckNhc2UoKSkpIHsKLQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWFSZWFkZXIuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCWlmIChyZXN1bHQpIHsKLQkJCWJhZENvcHlyaWdodHMrKzsKLQkJCXRyeSB7Ci0JCQkJaW50IHN0YXJ0ID0gYUZpbGUuZ2V0UGF0aCgpLmluZGV4T2YoInBsdWdpbnMiKTsKLQkJCQlTdHJpbmcgZmlsZU5hbWU7Ci0JCQkJaWYgKHN0YXJ0ID09IC0xKSB7Ci0JCQkJCWZpbGVOYW1lID0gYUZpbGUuZ2V0UGF0aCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpbGVOYW1lID0gYUZpbGUuZ2V0UGF0aCgpLnN1YnN0cmluZyhzdGFydCArICJwbHVnaW5zIi5sZW5ndGgoKSArIDEpOwotCQkJCX0KLQotCQkJCWFMb2cud3JpdGUoZmlsZU5hbWUpOwotCQkJCWFMb2cubmV3TGluZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkKLQkJfSBlbHNlIHsKLQkJCWdvb2RDb3B5cmlnaHRzKys7Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUNWU0VudHJ5KEZpbGUgYURpcmVjdG9yeSwgU3RyaW5nIGFMaW5lLCBCdWZmZXJlZFdyaXRlciBhTG9nKSB7Ci0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCi0JCVN0cmluZ1tdIGZpZWxkcyA9IHNwbGl0KGFMaW5lLCAiLyIpOwotCQlpZiAoZmllbGRzLmxlbmd0aCA8IE1JTl9FTlRSWV9GSUVMRFNfU0laRSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJU3RyaW5nIGV4cGVjdGVkVHlwZTsKLQkKLQkJLy8gU29tZSBlbnRpcmUgZGlyZWN0b3JpZXMgYXJlIG1hcmtlZCBhcyBCaW5hcnkuCQotCQlpZiAoaXNDVlNCaW5hcnlEaXJlY3RvcnkoYURpcmVjdG9yeSkpIHsKLQkJCWV4cGVjdGVkVHlwZSA9IENWU19CSU5BUlk7Ci0JCX0gZWxzZSB7Ci0JCQlleHBlY3RlZFR5cGUgPSBudWxsOwotCQl9Ci0JCQotCQlTdHJpbmcgZW50cnlOYW1lID0gYURpcmVjdG9yeSArIEZpbGUuc2VwYXJhdG9yICsgZmllbGRzW0VOVFJZX05BTUVfSU5ERVhdOwotCQlpZiAoZXhwZWN0ZWRUeXBlID09IG51bGwpIHsKLQkJCWV4cGVjdGVkVHlwZSAgPSAoU3RyaW5nKSBjdnNUeXBlcy5nZXQoZW50cnlOYW1lKTsKLQkJfQotCi0JCS8vIE5vIHR5cGUgcmVnaXN0ZXJlZCBmb3IgZXhhY3QgZmlsZSBuYW1lLiAgQ2hlY2sgZm9yIGV4dGVuc2lvbgotCQlpZiAoZXhwZWN0ZWRUeXBlID09IG51bGwpIHsJCQkKLQkJCQotCQkJU3RyaW5nW10gZG90UGFydHMgPSBzcGxpdChmaWVsZHNbRU5UUllfTkFNRV9JTkRFWF0sICIuIik7Ci0JCQlTdHJpbmcgZW50cnlFeHRlbnNpb247Ci0JCQlpZiAoZG90UGFydHMubGVuZ3RoID09IDApIHsKLQkJCQkvLyBGaWxlIG5hbWUgaGFzIG5vIGV4dGVuc2lvbi4KLQkJCQlleHBlY3RlZFR5cGUgPSBERUZBVUxUX0NWU19UWVBFOwotCQkJfSBlbHNlIHsKLQkJCQllbnRyeUV4dGVuc2lvbiA9IGRvdFBhcnRzW2RvdFBhcnRzLmxlbmd0aCAtIDFdOwotCQkJCWV4cGVjdGVkVHlwZSA9IChTdHJpbmcpIGN2c1R5cGVzLmdldChlbnRyeUV4dGVuc2lvbik7Ci0JCQkJaWYgKGV4cGVjdGVkVHlwZSA9PSBudWxsKSB7Ci0JCQkJCS8vIEV4dGVuc2lvbiBoYXMgbm8gdHlwZSByZWdpc3RlcmVkCi0JCQkJCWV4cGVjdGVkVHlwZSA9IERFRkFVTFRfQ1ZTX1RZUEU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBXZSBrbm93IHdoYXQgdHlwZSB0byBleHBlY3QgZm9yIHRoaXMgZmlsZS4gIEFyZSB3ZSB0aGUgcmlnaHQgb25lPwotCQkJCQotCQlTdHJpbmcgZW50cnlUeXBlID0gZmllbGRzW0VOVFJZX1RZUEVfSU5ERVhdOwotCQlpZiAoZW50cnlUeXBlLmxlbmd0aCgpID09IDApIHsKLQkJCWVudHJ5VHlwZSA9IENWU19LS1Y7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlpZiAoZXhwZWN0ZWRUeXBlLmVxdWFscyhDVlNfQklOQVJZKSkgewotCQkJCWlmICghZW50cnlUeXBlLmVxdWFscyhDVlNfS0IpKSB7Ci0JCQkJCS8vIEZhaWwgQmluYXJ5IFRlc3QKLQkJCQkJaW50IHN0YXJ0ID0gZW50cnlOYW1lLmluZGV4T2YoInBsdWdpbnMiKTsKLQkJCQkJU3RyaW5nIGZpbGVOYW1lOwotCQkJCQlpZiAoc3RhcnQgPT0gLTEpIHsKLQkJCQkJCWZpbGVOYW1lID0gZW50cnlOYW1lOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZmlsZU5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKHN0YXJ0ICsgInBsdWdpbnMiLmxlbmd0aCgpICsgMSk7Ci0JCQkJCX0KLQkJCQkJYUxvZy53cml0ZShmaWxlTmFtZSArICIgc2hvdWxkIGJlICpCSU5BUlkqIik7Ci0JCQkJCWFMb2cubmV3TGluZSgpOwotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCEoZW50cnlUeXBlLmVxdWFscyhDVlNfS0tWKSB8fCBlbnRyeVR5cGUuZXF1YWxzKENWU19LTykpKSB7Ci0JCQkJCS8vIEZhaWwKLQkJCQkJaW50IHN0YXJ0ID0gZW50cnlOYW1lLmluZGV4T2YoInBsdWdpbnMiKTsKLQkJCQkJU3RyaW5nIGZpbGVOYW1lOwotCQkJCQlpZiAoc3RhcnQgPT0gLTEpIHsKLQkJCQkJCWZpbGVOYW1lID0gZW50cnlOYW1lOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZmlsZU5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKHN0YXJ0ICsgInBsdWdpbnMiLmxlbmd0aCgpICsgMSk7Ci0JCQkJCX0KLQkJCQkJYUxvZy53cml0ZShmaWxlTmFtZSArICIgc2hvdWxkIGJlICpURVhUKiIpOwotCQkJCQlhTG9nLm5ld0xpbmUoKTsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIklPRXhjZXB0aW9uIHdyaXRpbmcgbG9nIik7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwkKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYURpcmVjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDVlNCaW5hcnlEaXJlY3RvcnkoRmlsZSBhRGlyZWN0b3J5KSB7Ci0JCVN0cmluZyBhU3RyaW5nID0gYURpcmVjdG9yeS5nZXRQYXRoKCkuc3Vic3RyaW5nKHNvdXJjZURpcmVjdG9yeU5hbWUubGVuZ3RoKCkpLnRvTG93ZXJDYXNlKCk7Ci0JCUl0ZXJhdG9yIGFuSXRlcmF0b3IgPSBjdnNEaXJlY3RvcnlUeXBlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoYW5JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhbkl0ZW0gPSAoU3RyaW5nKSBhbkl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChhU3RyaW5nLmluZGV4T2YoYW5JdGVtKSAhPSAtMSkgewotCQkJCXJldHVybiB0cnVlOyAKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFMaW5lCi0JICogQHBhcmFtIGRlbGltZXRlcgotCSAqIEByZXR1cm4gU3RyaW5nW10KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIHNwbGl0KFN0cmluZyBhTGluZSwgU3RyaW5nIGRlbGltZXRlcikgewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhTGluZSwgZGVsaW1ldGVyLCB0cnVlKTsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmcgbGFzdFRva2VuID0gIiI7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgYVRva2VuID0gKFN0cmluZykgdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaWYgKGFUb2tlbi5lcXVhbHMoZGVsaW1ldGVyKSkgewotCQkJCWlmIChsYXN0VG9rZW4uZXF1YWxzKGRlbGltZXRlcikpIHsKLQkJCQkJbGlzdC5hZGQoIiIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbGlzdC5hZGQoYVRva2VuKTsKLQkJCX0KLQkJCWxhc3RUb2tlbj1hVG9rZW47Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hrcGlpKCkgewotCQkJCi0JCQlTdHJpbmcgemlwRmlsZSA9IGxvY2F0ZUVjbGlwc2VaaXAoKTsKLS8vCQkJU3RyaW5nIHNuaWZmRm9sZGVyID0gQm9vdExvYWRlci5nZXRJbnN0YWxsVVJMKCkuZ2V0UGF0aCgpICsgInJlbGVuZ19zbmlmZl9mb2xkZXIiOwotLy8JCQlTdHJpbmcgc25pZmZGb2xkZXIgPSAiXFxidWlsZHNcXHQiOwotCQkJU3RyaW5nIHNuaWZmRm9sZGVyID0gUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQotCQkJdHJ5IHsKLQkJCQlGaWxlVG9vbC51bnppcChnZXRUcnVlRmlsdGVyKCksIG5ldyBaaXBGaWxlKHppcEZpbGUpLCBuZXcgRmlsZShzbmlmZkZvbGRlcikpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQotCQkJCQotCQkJCWZhaWwoemlwRmlsZSArICI6ICIgKyBzbmlmZkZvbGRlciAgKyAiOiAiICsgIklPRXhjZXB0aW9uIHVuemlwcGluZyBFY2xpcHNlIGZvciBjaGtwaWkiKTsKLQkJCX0KLQkJCi0JCQlib29sZWFuIHJlc3VsdDEgID0gdGVzdENoa3BpaShIVE1MKTsKLQkJCWJvb2xlYW4gcmVzdWx0MiA9IHRlc3RDaGtwaWkoWE1MKTsKLQkJCWJvb2xlYW4gcmVzdWx0MyA9IHRlc3RDaGtwaWkoUFJPUEVSVElFUyk7Ci0JCQlhc3NlcnRUcnVlKCJUcmFuc2xhdGlvbiBlcnJvcnMgaW4gZmlsZXMuICBTZWUgdGhlIGNoa3BpaSBsb2dzIGxpbmtlZCBmcm9tIHRoZSB0ZXN0IHJlc3VsdHMgcGFnZSBmb3IgZGV0YWlscy4iLCAocmVzdWx0MSAmJiByZXN1bHQyICYmIHJlc3VsdDMpKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBib29sZWFuIHRlc3RDaGtwaWkoaW50IHR5cGUpIHsKLQkJCVJ1bnRpbWUgYVJ1bnRpbWUgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKLQkJCVN0cmluZyBjaGtwaWlTdHJpbmcgPSBnZXRDaGtwaWlTdHJpbmcodHlwZSk7Ci0JCQl0cnkgewotCQkJCVByb2Nlc3MgYVByb2Nlc3MgPSBhUnVudGltZS5leGVjKGNoa3BpaVN0cmluZyk7Ci0JCQkJQnVmZmVyZWRSZWFkZXIgYUJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihhUHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0JCQkJU3RyaW5nIGxpbmUgPSBudWxsOwotCQkJCXdoaWxlICggKGxpbmUgPSBhQnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCX0KLQkJCQlhUHJvY2Vzcy53YWl0Rm9yKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuICFoYXNFcnJvcnMoZ2V0T3V0cHV0RmlsZSh0eXBlKSk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBNZXRob2QgZ2V0Q2hrcGlpU3RyaW5nLgotCQkgKiBAcGFyYW0gSFRNTAotCQkgKiBAcmV0dXJuIFN0cmluZwotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0Q2hrcGlpU3RyaW5nKGludCB0eXBlKSB7Ci0JCQlyZXR1cm4gZ2V0RXhlYygpICsgIiAiICsgZ2V0RmlsZXNUb1Rlc3QodHlwZSkgKyAiIC1FIC1PICIgKyBnZXRPdXRwdXRGaWxlKHR5cGUpICsgIiAtWE0gQCIgKyBnZXRFeGNsdWRlRXJyb3JzKCkgKyAiIC1YICIgKyBnZXRFeGNsdWRlRmlsZSAoKSArICIgLVMiOwotCQl9Ci0JCS8qKgotCQkgKiBNZXRob2QgbG9jYXRlRWNsaXBzZVppcC4KLQkJICogQHJldHVybiBTdHJpbmcKLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGxvY2F0ZUVjbGlwc2VaaXAoKSB7Ci0KLQkJCS8vIFN0cmluZyB0byB1c2Ugd2hlbiBydW5uaW5nIGFzIGFuIGF1dG9tYXRlZCB0ZXN0LgkJCQotCQkJU3RyaW5nIGluc3RhbGxEaXIgPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRVUkwoKS5nZXRQYXRoKCkrICIuLiIgKyBGaWxlLnNlcGFyYXRvciArICIuLiI7Ci0JCQkKLQkJCS8vIFN0cmluZyB0byB1c2Ugd2hlbiBydW5uaW5nIGluIEVjbGlwc2UKLQkJCS8vIFN0cmluZyBpbnN0YWxsRGlyID0gQm9vdExvYWRlci5nZXRJbnN0YWxsVVJMKCkuZ2V0UGF0aCgpICsgIi4uIjsKLQkJCUZpbGUgYUZpbGUgPSBuZXcgRmlsZShpbnN0YWxsRGlyKTsKLQkJCWlmIChhRmlsZSA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIGlzIG51bGwiKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpbnN0YWxsRGlyKTsKLQkJCQotCQkJRmlsZVtdIGZpbGVzID0gYUZpbGUubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0JCQkJU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCQkJaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoImVjbGlwc2UtU0RLLSIpICYmIGZpbGVOYW1lLmVuZHNXaXRoKCIuemlwIikpIHsKLQkJCQkJcmV0dXJuIGZpbGUuZ2V0UGF0aCgpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcmV0dXJuICIiOwotCQl9Ci0JCQotCQkvKioKLQkJICogTWV0aG9kIGdldEV4Y2x1ZGVGaWxlcy4KLQkJICogQHJldHVybiBTdHJpbmcKLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGdldEV4Y2x1ZGVGaWxlKCkgewotCQkJU3RyaW5nIGFTdHJpbmcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JCQlyZXR1cm4gYVN0cmluZytGaWxlLnNlcGFyYXRvcisiaWdub3JlRmlsZXMudHh0IjsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIE1ldGhvZCBnZXRPdXRwdXRGaWxlLgotCQkgKiBAcGFyYW0gSFRNTAotCQkgKiBAcmV0dXJuIFN0cmluZwotCQkgKi8KLQkJCi0JCXByaXZhdGUgU3RyaW5nIGdldE91dHB1dEZpbGUoaW50IHR5cGUpIHsKLQkJCi0KLQkJCW5ldyBGaWxlKGxvZ0ZpbGVOYW1lKS5ta2RpcnMoKTsKLQkJCQotCQkJU3RyaW5nIGFTdHJpbmcgPSBsb2dGaWxlTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgIm9yZy5lY2xpcHNlLm5scy4iOwotCQkJYVN0cmluZyA9IG5ldyBGaWxlKGFTdHJpbmcpLmdldFBhdGgoKTsKLQotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBIVE1MIDoKLQkJCQkJcmV0dXJuIGFTdHJpbmcgKyAiaHRtbC50eHQiOwotCQkJCWNhc2UgUFJPUEVSVElFUyA6Ci0JCQkJCXJldHVybiBhU3RyaW5nICsgInByb3BlcnRpZXMudHh0IjsKLQkJCQkKLQkJCQljYXNlIFhNTCA6IAotCQkJCQlyZXR1cm4gYVN0cmluZyArICJ4bWwudHh0IjsKLQotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gYVN0cmluZyArICJvdGhlci50eHQiOwotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogTWV0aG9kIGdldEZpbGVzVG9UZXN0LgotCQkgKiBAcGFyYW0gSFRNTAotCQkgKiBAcmV0dXJuIFN0cmluZwotCQkgKi8KLQkJCi0JCXByaXZhdGUgU3RyaW5nIGdldEZpbGVzVG9UZXN0KGludCB0eXBlKSB7Ci0JCQkKLQkJCVN0cmluZyBzbmlmZkZvbGRlciA9IFBsYXRmb3JtLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCi0JCQlTdHJpbmcgYVN0cmluZyA9IG5ldyBGaWxlKHNuaWZmRm9sZGVyKS5nZXRQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCQotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBIVE1MIDoKLQkJCQkJcmV0dXJuIGFTdHJpbmcgKyAiKi5odG0qIjsKLQkJCQljYXNlIFBST1BFUlRJRVMgOgotCQkJCQlyZXR1cm4gYVN0cmluZyArICIqLnByb3BlcnRpZXMiOwotCQkJCQkJCQotCQkJCWNhc2UgWE1MIDogCi0JCQkJCXJldHVybiBhU3RyaW5nICsgIioueG1sIjsKLQkJCQotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gYVN0cmluZyArICIqLioiOwotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogTWV0aG9kIGdldEV4ZWMuCi0JCSAqIEByZXR1cm4gU3RyaW5nCi0JCSAqLwotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0RXhlYygpIHsKLQotCQkJcmV0dXJuIG5ldyBGaWxlKCJjaGtwdzYwNi5leGUiKS5nZXRQYXRoKCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBNZXRob2QgZ2V0RXhjbHVkZUVycm9ycy4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGdldEV4Y2x1ZGVFcnJvcnMoKSB7Ci0JCQkKLQkJCVN0cmluZyBvcyA9IFBsYXRmb3JtLmdldE9TKCk7Ci0JCQlTdHJpbmcgZmlsZU5hbWU7Ci0JCQkKLQkJCWlmIChvcy5lcXVhbHMoIndpbjMyIikpIHsKLQkJCQlmaWxlTmFtZSA9ICJpZ25vcmVFcnJvcnNXaW5kb3dzLnR4dCI7Ci0JCQl9IGVsc2UgewotCQkJCWZpbGVOYW1lID0gImlnbm9yZUVycm9yc1VuaXgudHh0IjsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGFTdHJpbmcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JCQlyZXR1cm4gYVN0cmluZysgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTsKLQkJfQotCQkKLQkvKioKLQkgKiBNZXRob2QgcGFyc2VMaW5lLgotCSAqIEBwYXJhbSBhTGluZQotCSAqIEByZXR1cm4gLTEgaWYgbm90IGFuIGVycm9yIG9yIHdhcm5pbmcgbGluZSBvciB0aGUgbnVtYmVyIG9mIGVycm9ycyBvcgotCSAqIHdhcm5pbmdzLgotCSAqLwotCXByaXZhdGUgaW50IHBhcnNlTGluZShTdHJpbmcgYUxpbmUpIHsKLQkJaW50IGluZGV4ID0gYUxpbmUuaW5kZXhPZigiRmlsZXMgQ291bGQgTm90IEJlIFByb2Nlc3NlZDogIik7Ci0JCQotCQlpZiAoaW5kZXggPT0tMSl7Ci0JCQlpbmRleD1hTGluZS5pbmRleE9mKCJGaWxlcyBDb250YWluIEVycm9yIik7Ci0JCX0KLQkJCi0JCWlmIChpbmRleD09LTEpewotCQkJcmV0dXJuIC0xOwotCQl9IGVsc2UgewkJCi0JCQlTdHJpbmcgYVN0cmluZyA9IGFMaW5lLnN1YnN0cmluZygwLCBpbmRleCkudHJpbSgpOwotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoYVN0cmluZyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGNsYXNzIEZpbGVTdWZmaXhGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgc3VmZml4OwotCQkKLQkJcHVibGljIEZpbGVTdWZmaXhGaWx0ZXIoU3RyaW5nIHN1ZmZpeCkgewotCQkJdGhpcy5zdWZmaXggPSBzdWZmaXg7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAc2VlIGphdmEuaW8uRmlsZW5hbWVGaWx0ZXIjYWNjZXB0KGphdmEuaW8uRmlsZSwgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLQkJCWludCBsYXN0RG90ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGxhc3REb3QgPT0gLTEpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobGFzdERvdCkuZXF1YWxzKHN1ZmZpeCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gUkVRVUlSRURfRkVBVFVSRV9GSUxFUyA9IHsiY3BsLXYxMC5odG1sIiwgImZlYXR1cmUucHJvcGVydGllcyIsICJmZWF0dXJlLnhtbCIsICJsaWNlbnNlLmh0bWwifTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRF9GRUFUVVJFX1NVRkZJWCA9ICIuanBnIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gUkVRVUlSRURfUExVR0lOX0ZJTEVTID0geyJhYm91dC5odG1sIiwgInBsdWdpbi5wcm9wZXJ0aWVzIiwgInBsdWdpbi54bWwifTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRF9QTFVHSU5fU1VGRklYID0gIi5qYXIiOwotCQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJFUVVJUkVEX0ZFQVRVUkVfUExVR0lOX0ZJTEVTID0geyJhYm91dC5odG1sIiwgImFib3V0LmluaSIsICJhYm91dC5tYXBwaW5ncyIsICJhYm91dC5wcm9wZXJ0aWVzIiwgInBsdWdpbi5wcm9wZXJ0aWVzIiwgInBsdWdpbi54bWwifTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRF9GRUFUVVJFX1BMVUdJTl9TVUZGSVggPSAiLmdpZiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJFUVVJUkVEX0ZSQUdNRU5UX0ZJTEVTID0geyJmcmFnbWVudC54bWwifTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRF9GUkFHTUVOVF9TVUZGSVggPSAiIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJFUVVJUkVEX1NPVVJDRV9GSUxFUyA9IHsiYWJvdXQuaHRtbCJ9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEX1NPVVJDRV9TVUZGSVggPSAiLnppcCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBSRVFVSVJFRF9CVU5ETEVfRklMRVMgPSB7ImFib3V0Lmh0bWwifTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRF9CVU5ETEVfTUFOSUZFU1QgPSAiTUFOSUZFU1QuTUYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEX0JVTkRMRV9TVUZGSVggPSAiLmphciI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVUZGSVhfRVhFTVBUX0xJU1QgPSB7Im9yZy5lY2xpcHNlLnN3dCIsIm9yZy5hcGFjaGUuYW50In07Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExVR0lOX0NPVU5UID0gODQ7IC8vIC0gMjA7CS8vIE5vdGUgdGhpcyBudW1iZXIgbXVzdCBpbmNsdWRlIG5vbi1zaGlwcGluZyB0ZXN0IHBsdWdpbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0NPVU5UID0gOTsgLy8gLSAxOwkvLyBOb3RlIHRoaXMgbnVtYmVyIG11c3QgaW5jbHVkZSBub24tc2hpcHBpbmcgdGVzdCBmZWF0dXJlCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW1wdHlEaXJlY3Rvcmllc1Rlc3QuCi0JICogQHBhcmFtIGFyZzAKLQkgKi8KLQlwdWJsaWMgQnVpbGRUZXN0cyhTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJLy8gQXV0b2FtdGVkIFRlc3QKLQkJbG9nRmlsZU5hbWUgPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRVUkwoKS5nZXRQYXRoKCkgKyAiLi4iICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iICsgRmlsZS5zZXBhcmF0b3IgKyAicmVzdWx0cyIgKyBGaWxlLnNlcGFyYXRvciArICJjaGtwaWkiOyAgLy8gQSB0YWQgYm9ndXMgYnV0IHRoaXMgaXMgd2hlcmUgdGhlIGJ1aWxkIHdhbnRzIHRvIGNvcHkgdGhlIHJlc3VsdHMgZnJvbSEKLQkJc291cmNlRGlyZWN0b3J5TmFtZSA9IFBsYXRmb3JtLmdldEluc3RhbGxMb2NhdGlvbigpLmdldFVSTCgpLmdldFBhdGgoKSArICAiLi4iICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iICsgRmlsZS5zZXBhcmF0b3IgKyAic3JjIjsKLQotCQkvLyBSdW50aW1lIFdvcmtiZW5jaCAtIFRPREkgUHV0IG1lIGJhY2sgdG8gQXV0b21hdGVkIHN0YXR1cwotLy8JCWxvZ0ZpbGVOYW1lID0gImQ6XFxyZXN1bHRzIjsKLS8vCQlzb3VyY2VEaXJlY3RvcnlOYW1lID0gImQ6XFxzb3VyY2VGZXRjaCI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUZpbGVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nIGluc3RhbGxEaXIgPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRVUkwoKS5nZXRQYXRoKCk7Ci0JCUZpbGUgZmVhdHVyZURpciA9IG5ldyBGaWxlKGluc3RhbGxEaXIsICJmZWF0dXJlcyIpOwotCQlGaWxlW10gZmVhdHVyZXMgPSBmZWF0dXJlRGlyLmxpc3RGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGFGZWF0dXJlID0gZmVhdHVyZXNbaV07Ci0JCQlpZiAoIXRlc3REaXJlY3RvcnkoYUZlYXR1cmUsIFJFUVVJUkVEX0ZFQVRVUkVfRklMRVMsIFJFUVVJUkVEX0ZFQVRVUkVfU1VGRklYKSkgewotCQkJCXJlc3VsdC5hZGQoYUZlYXR1cmUuZ2V0UGF0aCgpKTsKLQkJCX0KLQotCQl9Ci0JCQotCQlTdHJpbmcgYVN0cmluZyA9ICIiOwotCQlpZiAocmVzdWx0LnNpemUoKSA+IDApIHsKLQkJCQotCQkJSXRlcmF0b3IgaXRlciA9IHJlc3VsdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIGVsZW1lbnQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlhU3RyaW5nID0gYVN0cmluZyArIGVsZW1lbnQgKyAiOyAiOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIkZlYXR1cmUgZGlyZWN0b3J5IG1pc3NpbmcgcmVxdWlyZWQgZmlsZXM6ICIgKyBhU3RyaW5nLCByZXN1bHQuc2l6ZSgpID09IDApOwotCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHRlc3RQbHVnaW5Db3VudCgpIHsKLS8vCQlTdHJpbmcgaW5zdGFsbERpciA9IEJvb3RMb2FkZXIuZ2V0SW5zdGFsbFVSTCgpLmdldFBhdGgoKTsKLS8vCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKGluc3RhbGxEaXIsICJwbHVnaW5zIik7Ci0vLwkJRmlsZVtdIHBsdWdpbnMgPSBwbHVnaW5EaXIubGlzdEZpbGVzKCk7Ci0vLwotLy8JCWFzc2VydFRydWUoIlBsdWctaW5zIG1pc3Npbmc6ICIgKyAoUExVR0lOX0NPVU5UIC0gcGx1Z2lucy5sZW5ndGgpLCBQTFVHSU5fQ09VTlQgPT0gcGx1Z2lucy5sZW5ndGgpOwotLy8JfQotCQotLy8JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVDb3VudCgpIHsKLS8vCQlTdHJpbmcgaW5zdGFsbERpciA9IEJvb3RMb2FkZXIuZ2V0SW5zdGFsbFVSTCgpLmdldFBhdGgoKTsKLS8vCQlGaWxlIGZlYXR1cmVEaXIgPSBuZXcgRmlsZShpbnN0YWxsRGlyLCAiZmVhdHVyZXMiKTsKLS8vCQlGaWxlW10gZmVhdHVyZXMgPSBmZWF0dXJlRGlyLmxpc3RGaWxlcygpOwotLy8KLS8vCQlhc3NlcnRUcnVlKCJGZWF0dXJlcyBtaXNzaW5nOiAiICsgKEZFQVRVUkVfQ09VTlQgLSBmZWF0dXJlcy5sZW5ndGgpLCBGRUFUVVJFX0NPVU5UID09IGZlYXR1cmVzLmxlbmd0aCk7Ci0vLwl9Ci0vLwkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luRmlsZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmcgaW5zdGFsbERpciA9IFBsYXRmb3JtLmdldEluc3RhbGxMb2NhdGlvbigpLmdldFVSTCgpLmdldFBhdGgoKTsKLQkJRmlsZSBwbHVnaW5EaXIgPSBuZXcgRmlsZShpbnN0YWxsRGlyLCAicGx1Z2lucyIpOwotCQlGaWxlW10gcGx1Z2lucyA9IHBsdWdpbkRpci5saXN0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGFQbHVnaW4gPSBwbHVnaW5zW2ldOwotCQkJaWYgKGFQbHVnaW4uZ2V0TmFtZSgpLmluZGV4T2YoInRlc3QiKSA9PSAtMSkgewotCQkJCWlmICghdGVzdFBsdWdpbkZpbGUoYVBsdWdpbikpIHsKLQkJCQkJcmVzdWx0LmFkZChhUGx1Z2luLmdldFBhdGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGFTdHJpbmcgPSAiIjsKLQkJaWYgKHJlc3VsdC5zaXplKCkgPiAwKSB7Ci0KLQkJCUl0ZXJhdG9yIGl0ZXIgPSByZXN1bHQuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBlbGVtZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJYVN0cmluZyA9IGFTdHJpbmcgKyBlbGVtZW50ICsgIjsgIjsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJQbHVnaW4gZGlyZWN0b3J5IG1pc3NpbmcgcmVxdWlyZWQgZmlsZXM6ICIgKyBhU3RyaW5nLCByZXN1bHQuc2l6ZSgpID09IDApOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB0ZXN0UGx1Z2luRmlsZShGaWxlIGFQbHVnaW4pIHsKLQkKLQkJLy8gQXJlIHdlIGEgZG9jIHBsdWdpbj8KLQkJaWYgKHRlc3REaXJlY3RvcnkoYVBsdWdpbiwgUkVRVUlSRURfUExVR0lOX0ZJTEVTLCAiLnppcCIpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJLy8gQXJlIHdlIGEgZmVhdHVyZSBwbHVnaW4/Ci0JCWlmICh0ZXN0RGlyZWN0b3J5KGFQbHVnaW4sIFJFUVVJUkVEX0ZFQVRVUkVfUExVR0lOX0ZJTEVTLCBSRVFVSVJFRF9GRUFUVVJFX1BMVUdJTl9TVUZGSVgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQotCQkvLyBBcmUgd2UgYSByZWd1bGFyIHBsdWdpbgotCQlpZiAodGVzdERpcmVjdG9yeShhUGx1Z2luLCBSRVFVSVJFRF9QTFVHSU5fRklMRVMsIFJFUVVJUkVEX1BMVUdJTl9TVUZGSVgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCQotCQkKLQkJLy8gQXJlIHdlIGEgc291cmNlIHBsdWdpbgotCQlpZiAodGVzdFNvdXJjZVBsdWdpbihhUGx1Z2luKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCS8vIEFyZSB3ZSBhIGZyYWdtZW50Ci0JCWlmICh0ZXN0RGlyZWN0b3J5KGFQbHVnaW4sIFJFUVVJUkVEX0ZSQUdNRU5UX0ZJTEVTLCBSRVFVSVJFRF9GUkFHTUVOVF9TVUZGSVgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJLy8gQXJlIHdlIGEgYnVuZGxlPwotCQlpZiAodGVzdEJ1bmRsZURpcmVjdG9yeShhUGx1Z2luLCBSRVFVSVJFRF9CVU5ETEVfRklMRVMsIFJFUVVJUkVEX0JVTkRMRV9NQU5JRkVTVCwgUkVRVUlSRURfQlVORExFX1NVRkZJWCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQkvLyBObyB0aGVuIHdlIGFyZSBiYWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gdGVzdERpcmVjdG9yeShGaWxlIGFEaXJlY3RvcnksIFN0cmluZ1tdIHJlcXVpcmVkRmlsZXMsIFN0cmluZyByZXF1aXJlZFN1ZmZpeCkgewotCQlpZiAoIUFycmF5cy5hc0xpc3QoYURpcmVjdG9yeS5saXN0KCkpLmNvbnRhaW5zQWxsKEFycmF5cy5hc0xpc3QocmVxdWlyZWRGaWxlcykpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWludCBpbmRleCA9IGFEaXJlY3RvcnkuZ2V0TmFtZSgpLmluZGV4T2YoJ18nKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlpbmRleCA9IGFEaXJlY3RvcnkuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQl9Ci0JCQotCQlTdHJpbmcgcGxhaW5OYW1lID0gYURpcmVjdG9yeS5nZXROYW1lKCkuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCi0JCWlmIChyZXF1aXJlZFN1ZmZpeC5lcXVhbHMoIiIpIHx8IEFycmF5cy5hc0xpc3QoU1VGRklYX0VYRU1QVF9MSVNUKS5jb250YWlucyhwbGFpbk5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChhRGlyZWN0b3J5Lmxpc3RGaWxlcyhuZXcgRmlsZVN1ZmZpeEZpbHRlcihyZXF1aXJlZFN1ZmZpeCkpLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gdGVzdEJ1bmRsZURpcmVjdG9yeShGaWxlIGFEaXJlY3RvcnksIFN0cmluZ1tdIHJlcXVpcmVkRmlsZXMsIFN0cmluZyBtYW5pZmVzdEZpbGUsIFN0cmluZyByZXF1aXJlZFN1ZmZpeCkgewotCQlpZiAoIUFycmF5cy5hc0xpc3QoYURpcmVjdG9yeS5saXN0KCkpLmNvbnRhaW5zQWxsKEFycmF5cy5hc0xpc3QocmVxdWlyZWRGaWxlcykpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWludCBpbmRleCA9IGFEaXJlY3RvcnkuZ2V0TmFtZSgpLmluZGV4T2YoJ18nKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlpbmRleCA9IGFEaXJlY3RvcnkuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQl9CQotCQkKLQkJU3RyaW5nIHBsYWluTmFtZSA9IGFEaXJlY3RvcnkuZ2V0TmFtZSgpLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCi0JCUZpbGUgbWV0YURpciA9IG5ldyBGaWxlKGFEaXJlY3RvcnksICJNRVRBLUlORiIpOwkgICAgCi0JCQkKLQkJU3RyaW5nW10gbWV0YUZpbGVzID0gbWV0YURpci5saXN0KCk7Ci0JICAgIGlmIChtZXRhRmlsZXMgPT0gbnVsbCkgewotCQkgICAgICAgIHJldHVybihmYWxzZSk7Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgIGZvciAoaW50IGk9MDsgaSA8IG1ldGFGaWxlcy5sZW5ndGg7IGkrKykgewkJICAgICAgICAgICAgCi0JICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gbWV0YUZpbGVzW2ldOwotCSAgICAgICAgICAgIGlmIChmaWxlbmFtZSA9PSBtYW5pZmVzdEZpbGUpIHsKLQkgICAgICAgICAgICAJcmV0dXJuIHRydWU7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICB9Ci0JCQotCQlpZiAoISBtZXRhRGlyLmV4aXN0cygpKXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkJCQkJCi0JCWlmIChyZXF1aXJlZFN1ZmZpeC5lcXVhbHMoIiIpIHx8IEFycmF5cy5hc0xpc3QoU1VGRklYX0VYRU1QVF9MSVNUKS5jb250YWlucyhwbGFpbk5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChhRGlyZWN0b3J5Lmxpc3RGaWxlcyhuZXcgRmlsZVN1ZmZpeEZpbHRlcihyZXF1aXJlZFN1ZmZpeCkpLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIHNvdXJjZSBwbHVnaW4sIGZhbHNlIG90aGVyd2lzZQotCSAqIEEgc2VwYXJhdGUgbWV0aG9kIGJlY2F1c2UgdGhpcyBpcyBhIGxpdHRsZSB0cmlja3kuCi0JICogQHBhcmFtIGFQbHVnaW4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdGVzdFNvdXJjZVBsdWdpbihGaWxlIGFQbHVnaW4pIHsKLQkJaWYgKCF0ZXN0RGlyZWN0b3J5KGFQbHVnaW4sIFJFUVVJUkVEX1BMVUdJTl9GSUxFUywgIiIpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUZpbGUgc291cmNlRGlyID0gbmV3IEZpbGUoYVBsdWdpbiwgInNyYyIpOwotCQlGaWxlW10gc291cmNlRGlycyA9IHNvdXJjZURpci5saXN0RmlsZXMoKTsKLQkJaWYgKHNvdXJjZURpcnMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZURpcnMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgYVNvdXJjZURpciA9IHNvdXJjZURpcnNbaV07Ci0JCQlpZiAoIXRlc3REaXJlY3RvcnkoYVNvdXJjZURpciwgUkVRVUlSRURfU09VUkNFX0ZJTEVTLCBSRVFVSVJFRF9TT1VSQ0VfU1VGRklYKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9CQotCi0JCQotfQotCi0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rlc3RzL0ZpbGVUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rlc3RzL0ZpbGVUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNzAxNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90ZXN0cy9GaWxlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotCi0vKioKLSAqIEEgdG9vbCBmb3IgcGVyZm9ybWluZyBvcGVyYXRpb25zIG9uIGZpbGVzLgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVRvb2wgewotCS8qKgotCSAqIEEgemlwIGZpbHRlciB3aGljaCBpcyB1c2VkIHRvIGZpbHRlciBvdXQgdW53YW50ZWQgZW50cmllcwotCSAqIHdoaWxlIGV4dHJhY3RpbmcgYSB6aXAgZmlsZS4KLQkgKiAKLQkgKiBAc2VlIEZpbGVUb29sI3VuemlwKElaaXBGaWx0ZXIsIFppcEZpbGUsIEZpbGUsIExvZykKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIElaaXBGaWx0ZXIgewotCQkvKioKLQkJICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbnRyeSB3aXRoIHRoZQotCQkgKiBzcGVjaWZpZWQgbmFtZSBzaG91bGQgYmUgZXh0cmFjdGVkIGZyb20gdGhlIHppcCBmaWxlLgotCQkgKiAKLQkJICogQHBhcmFtIGZ1bGxFbnRyeU5hbWUgdGhlIGZ1bGwgZW50cnkgbmFtZTsgaW5jbHVkZXMgZnVsbAotCQkgKiBwYXRoIHNlZ21lbnRzIGZvciBuZXN0ZWQgemlwIGVudHJpZXMKLQkJICogQHBhcmFtIGVudHJ5TmFtZSB0aGUgcGFydGlhbCBlbnRyeSBuYW1lOyBvbmx5IGluY2x1ZGVzCi0JCSAqIHBhdGggc2VnbWVudHMgZnJvbSB0aGUgY3VycmVjdCB6aXAgZW50cnkKLQkJICogQHBhcmFtIGRlcHRoIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvCi0JCSAqIHdoaWNoIHNwZWNpZmllcyB0aGUgZGVwdGggb2YgdGhlIGN1cnJlbnQgbmVzdGVkIHppcAotCQkgKiBlbnRyeQotCQkgKiBAcmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVudHJ5IHdpdGggdGhlCi0JCSAqIHNwZWNpZmllZCBuYW1lIHNob3VsZCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgemlwIGZpbGUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZEV4dHJhY3QoU3RyaW5nIGZ1bGxFbnRyeU5hbWUsIFN0cmluZyBlbnRyeU5hbWUsIGludCBkZXB0aCk7Ci0JCS8qKgotCQkgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVudHJ5ICh3aGljaAotCQkgKiBpcyBhIHppcC9qYXIgZmlsZSkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgc2hvdWxkIGJlCi0JCSAqIGV4dHJhY3RlZCBmcm9tIHRoZSB6aXAgZmlsZSBhbmQgdGhlbiB1bnppcHBlZC4KLQkJICogCi0JCSAqIEBwYXJhbSBmdWxsRW50cnlOYW1lIHRoZSBmdWxsIGVudHJ5IG5hbWU7IGluY2x1ZGVzIGZ1bGwKLQkJICogcGF0aCBzZWdtZW50cyBmb3IgbmVzdGVkIHppcCBlbnRyaWVzCi0JCSAqIEBwYXJhbSBlbnRyeU5hbWUgdGhlIHBhcnRpYWwgZW50cnkgbmFtZTsgb25seSBpbmNsdWRlcwotCQkgKiBwYXRoIHNlZ21lbnRzIGZyb20gdGhlIGN1cnJlY3QgemlwIGVudHJ5Ci0JCSAqIEBwYXJhbSBkZXB0aCBhIG51bWJlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVybwotCQkgKiB3aGljaCBzcGVjaWZpZXMgdGhlIGRlcHRoIG9mIHRoZSBjdXJyZW50IG5lc3RlZCB6aXAKLQkJICogZW50cnkKLQkJICogQHJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbnRyeSAod2hpY2gKLQkJICogaXMgYSB6aXAvamFyIGZpbGUpIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHNob3VsZCBiZQotCQkgKiBleHRyYWN0ZWQgZnJvbSB0aGUgemlwIGZpbGUgYW5kIHRoZW4gdW56aXBwZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZFVuemlwKFN0cmluZyBmdWxsRW50cnlOYW1lLCBTdHJpbmcgZW50cnlOYW1lLCBpbnQgZGVwdGgpOwotCX0KLQkvKioKLQkgKiBBIGJ1ZmZlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2l2ZW4gZmlsZSBwYXRoIHdpdGggaXRzIHNlcGFyYXRvcgotCSAqIGNoYXJhY3RlciBjaGFuZ2VkIGZyb20gdGhlIGdpdmVuIG9sZCBzZXBhcmF0b3IgdG8gdGhlCi0JICogZ2l2ZW4gbmV3IHNlcGFyYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIGZpbGUgcGF0aAotCSAqIEBwYXJhbSBvbGRTZXBhcmF0b3IgYSBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIKLQkgKiBAcGFyYW0gbmV3U2VwYXJhdG9yIGEgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVyCi0JICogQHJldHVybiB0aGUgZmlsZSBwYXRoIHdpdGggaXRzIHNlcGFyYXRvciBjaGFyYWN0ZXIKLQkgKiBjaGFuZ2VkIGZyb20gdGhlIGdpdmVuIG9sZCBzZXBhcmF0b3IgdG8gdGhlIGdpdmVuIG5ldwotCSAqIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZVNlcGFyYXRvcihTdHJpbmcgcGF0aCwgY2hhciBvbGRTZXBhcmF0b3IsIGNoYXIgbmV3U2VwYXJhdG9yKXsKLQkJcmV0dXJuIHBhdGgucmVwbGFjZShvbGRTZXBhcmF0b3IsIG5ld1NlcGFyYXRvcik7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZXMKLQkgKiBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIGZpbGUxIHRoZSBmaXJzdCBmaWxlCi0JICogQHBhcmFtIGZpbGUyIHRoZSBzZWNvbmQgZmlsZQotCSAqIEByZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZXMKLQkgKiBoYXZlIHRoZSBzYW1lIGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZShGaWxlIGZpbGUxLCBGaWxlIGZpbGUyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZihmaWxlMS5sZW5ndGgoKSAhPSBmaWxlMi5sZW5ndGgoKSl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSW5wdXRTdHJlYW0gaXMxID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaXMyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlzMSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTEpKTsKLQkJCWlzMiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTIpKTsKLQkJCWludCBhID0gMDsKLQkJCWludCBiID0gMDsKLQkJCWJvb2xlYW4gc2FtZSA9IHRydWU7Ci0JCQl3aGlsZShzYW1lICYmIGEgIT0gLTEgJiYgYiAhPSAtMSl7Ci0JCQkJYSA9IGlzMS5yZWFkKCk7Ci0JCQkJYiA9IGlzMi5yZWFkKCk7Ci0JCQkJc2FtZSA9IGEgPT0gYjsKLQkJCX0KLQkJCXJldHVybiBzYW1lOwotCQl9IGZpbmFsbHkgewotCQkJaWYoaXMyICE9IG51bGwpewotCQkJCXRyeSB7Ci0JCQkJCWlzMi5jbG9zZSgpOwotCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0JCQkJfQotCQkJfQotCQkJaWYoaXMxICE9IG51bGwpewotCQkJCXRyeSB7Ci0JCQkJCWlzMS5jbG9zZSgpOwotCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIENvcGllcyB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgdG8gdGhlIGdpdmVuIGRlc3RpbmF0aW9uIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHNyYyB0aGUgZ2l2ZW4gc291cmNlIGZpbGUKLQkgKiBAcGFyYW0gZHN0IHRoZSBnaXZlbiBkZXN0aW5hdGlvbiBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHkoRmlsZSBzcmMsIEZpbGUgZHN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljb3B5KHNyYy5nZXRQYXJlbnRGaWxlKCksIHNyYywgZHN0KTsKLQl9Ci0JLyoqCi0JICogQ29waWVzIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSB0byB0aGUgZ2l2ZW4gZGVzdGluYXRpb24gZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdAotCSAqIEBwYXJhbSBzcmMgdGhlIGdpdmVuIHNvdXJjZSBmaWxlCi0JICogQHBhcmFtIGRzdCB0aGUgZ2l2ZW4gZGVzdGluYXRpb24gZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KEZpbGUgcm9vdCwgRmlsZSBzcmMsIEZpbGUgZHN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZihzcmMuaXNEaXJlY3RvcnkoKSl7Ci0JCQlTdHJpbmdbXSBjaGlsZHJlbiA9IHNyYy5saXN0KCk7Ci0JCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpewotCQkJCUZpbGUgY2hpbGQgPSBuZXcgRmlsZShzcmMsIGNoaWxkcmVuW2ldKTsKLQkJCQljb3B5KHJvb3QsIGNoaWxkLCBkc3QpOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3RyaW5nIHJvb3RTdHJpbmcgPSByb290LnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgc3JjU3RyaW5nID0gc3JjLnRvU3RyaW5nKCk7Ci0JCQlGaWxlIGRzdEZpbGUgPSBuZXcgRmlsZShkc3QsIHNyY1N0cmluZy5zdWJzdHJpbmcocm9vdFN0cmluZy5sZW5ndGgoKSArIDEpKTsKLQkJCXRyYW5zZmVyRGF0YShzcmMsIGRzdEZpbGUpOwotCQl9Ci0JfQotCS8qKgotCSAqIERlbGV0ZSB0aGUgZ2l2ZW4gZmlsZSBvciBkaXJlY3RvcnkuIERpcmVjdG9yaWVzIGFyZQotCSAqIGRlbGV0ZWQgcmVjdXJzaXZlbHkuIElmIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBjYW4KLQkgKiBub3QgYmUgZGVsZXRlZCwgYSB3YXJuaW5nIG1lc3NhZ2UgaXMgd3JpdHRlbiB0bwotCSAqIHN0ZG91dC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSBhIGZpbGUgb3IgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGZpbGUpIHsKLQkJaWYoZmlsZS5leGlzdHMoKSl7Ci0JCQlpZihmaWxlLmlzRGlyZWN0b3J5KCkpewotCQkJCVN0cmluZ1tdIGNoaWxkcmVuID0gZmlsZS5saXN0KCk7Ci0JCQkJZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0JCQkJCUZpbGUgY2hpbGQgPSBuZXcgRmlsZShmaWxlLCBjaGlsZHJlbltpXSk7Ci0JCQkJCWRlbGV0ZShjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQkJaWYoIWZpbGUuZGVsZXRlKCkpewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV0FSTklORzogY291bGQgbm90IGRlbGV0ZSAiICsgZmlsZSk7Ci0JCQl9Ci0JCQkJCi0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJucyBhIG5ldyA8Y29kZT5GaWxlPC9jb2RlPiBmcm9tIHRoZSBnaXZlbiBwYXRoCi0JICogbmFtZSBzZWdtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VnbWVudHMgdGhlIGdpdmVuIHBhdGggbmFtZSBzZWdtZW50cwotCSAqIEByZXR1cm4gYSBuZXcgPGNvZGU+RmlsZTwvY29kZT4gZnJvbSB0aGUgZ2l2ZW4gcGF0aAotCSAqIG5hbWUgc2VnbWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0RmlsZShTdHJpbmdbXSBzZWdtZW50cykgewotCQlGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKHNlZ21lbnRzWzBdKTsKLQkJZm9yKGludCBpID0gMTsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgKytpKXsKLQkJCXJlc3VsdCA9IG5ldyBGaWxlKHJlc3VsdCwgc2VnbWVudHNbaV0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBmaWxlcyBiZWxvdyB0aGUgZ2l2ZW4gZGlyZWN0b3J5Ci0JICogdGhhdCBlbmQgd2l0aCBhIHN0cmluZyBpbiB0aGUgZ2l2ZW4gaW5jbHVkZSBsaXN0IGFuZAotCSAqIGRvIG5vdCBlbmQgd2l0aCBhIHN0cmluZyBpbiB0aGUgZ2l2ZW4gZXhjbHVkZSBsaXN0LgotCSAqIElmIGluY2x1ZGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gYWxsIGZpbGVzIGFyZSBpbmNsdWRlZAotCSAqIGV4Y2VwdCB0aG9zZSB0aGF0IGFyZSBleHBsaWNpdGx5IGV4Y2x1ZGVkLiBJZiBleGNsdWRlCi0JICogaXMgPGNvZGU+bnVsbDwvY29kZT4gbm8gZmlsZXMgYXJlIGV4Y2x1ZGVkIGV4Y2VwdCB0aG9zZQotCSAqIHRoYXQgYXJlIG5vdCBpbmNsdWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyIHRoZSBnaXZlbiBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gaW5jbHVkZSBhIGxpc3Qgb2YgZmlsZW5hbWVzIHRvIGluY2x1ZGUKLQkgKiBAcGFyYW0gZXhjbHVkZSBhIGxpc3Qgb2YgZmlsZW5hbWVzIHRvIGV4Y2x1ZGUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBhbGwgZmlsZXMgYmVsb3cgdGhlIGdpdmVuIGRpcmVjdG9yeQotCSAqIHRoYXQgYXJlIGluY2x1ZGVkIGFuZCBub3QgZXhwbGljaXRseSBleGNsdWRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZVtdIGdldEZpbGVzKEZpbGUgZGlyLCBTdHJpbmdbXSBpbmNsdWRlLCBTdHJpbmdbXSBleGNsdWRlKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nW10gY2hpbGRyZW4gPSBkaXIubGlzdCgpOwotCQlpZihjaGlsZHJlbiA9PSBudWxsKXsKLQkJCXJldHVybiBuZXcgRmlsZVswXTsKLQkJfQotCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpewotCQkJRmlsZSBjaGlsZCA9IG5ldyBGaWxlKGRpciwgY2hpbGRyZW5baV0pOwotCQkJU3RyaW5nIG5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0JCQlpZihjaGlsZC5pc0RpcmVjdG9yeSgpKXsKLQkJCQlGaWxlW10gcmVzdWx0ID0gZ2V0RmlsZXMoY2hpbGQsIGluY2x1ZGUsIGV4Y2x1ZGUpOwotCQkJCWZvcihpbnQgaiA9IDA7IGogPCByZXN1bHQubGVuZ3RoOyArK2opewotCQkJCQlsaXN0LmFkZChyZXN1bHRbal0pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYm9vbGVhbiBpbmNsdWRlRmlsZSA9IGluY2x1ZGUgPT0gbnVsbDsKLQkJCQlpZihpbmNsdWRlICE9IG51bGwpewotCQkJCQlmb3IoaW50IGogPSAwOyBqIDwgaW5jbHVkZS5sZW5ndGg7ICsrail7Ci0JCQkJCQlpZihuYW1lLmVuZHNXaXRoKGluY2x1ZGVbal0pKXsKLQkJCQkJCQlpbmNsdWRlRmlsZSA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYm9vbGVhbiBleGNsdWRlRmlsZSA9IGV4Y2x1ZGUgIT0gbnVsbDsKLQkJCQlpZihleGNsdWRlICE9IG51bGwpewotCQkJCQlmb3IoaW50IGogPSAwOyBqIDwgZXhjbHVkZS5sZW5ndGg7ICsrail7Ci0JCQkJCQlpZihuYW1lLmVuZHNXaXRoKGV4Y2x1ZGVbal0pKXsKLQkJCQkJCQlleGNsdWRlRmlsZSA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoaW5jbHVkZUZpbGUgJiYgIWV4Y2x1ZGVGaWxlKXsKLQkJCQkJbGlzdC5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKEZpbGVbXSlsaXN0LnRvQXJyYXkobmV3IEZpbGVbMF0pOwotCX0KLQkvKioKLQkgKiBCcmVha3MgdGhlIGdpdmVuIGZpbGUgaW50byBpdHMgcGF0aCBuYW1lIHNlZ21lbnRzCi0JICogYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSBhIGZpbGUgb3IgZGlyZWN0b3J5Ci0JICogQHJldHVybiB0aGUgcGF0aCBuYW1lIHNlZ21lbnRzIG9mIHRoZSBnaXZlbiBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTZWdtZW50cyhGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGdldFNlZ21lbnRzKGZpbGUudG9TdHJpbmcoKSwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQl9Ci0JLyoqCi0JICogQnJlYWtzIHRoZSBnaXZlbiBzdHJpbmcgaW50byBzZWdtZW50cyBhbmQgcmV0dXJucyB0aGUKLQkgKiByZXN1bHQuCi0JICogCi0JICogQHBhcmFtIHMgYSBzdHJpbmcKLQkgKiBAcGFyYW0gc2VwYXJhdG9yIHRoZSBzZWdtZW50IHNlcGFyYXRvcgotCSAqIEByZXR1cm4gdGhlIHNlZ21lbnRzIG9mIHRoZSBnaXZlbiBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNlZ21lbnRzKFN0cmluZyBzLCBjaGFyIHNlcGFyYXRvcil7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAiIiArIHNlcGFyYXRvcik7Ci0JCXdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpewotCQkJcmVzdWx0LmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgYSB2ZWN0b3Igb2YgPGNvZGU+RmlsZTwvY29kZT4gcGF0aHMgcGFyc2VkIGZyb20KLQkgKiB0aGUgZ2l2ZW4gcGF0aHMgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXRocyBhIHBhdGhzIHN0cmluZwotCSAqIEByZXR1cm4gYSB2ZWN0b3Igb2YgPGNvZGU+RmlsZTwvY29kZT4gcGF0aHMgcGFyc2VkIGZyb20KLQkgKiB0aGUgZ2l2ZW4gcGF0aHMgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlW10gcGFyc2VQYXRocyhTdHJpbmcgcGF0aHMpewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0aHMsICI7Iik7Ci0JCXdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpewotCQkJcmVzdWx0LmFkZChuZXcgRmlsZSh0b2tlbml6ZXIubmV4dFRva2VuKCkpKTsKLQkJfQotCQlyZXR1cm4gKEZpbGVbXSlyZXN1bHQudG9BcnJheShuZXcgRmlsZVswXSk7Ci0JfQotCS8qKgotCSAqIENvcGllcyBhbGwgYnl0ZXMgaW4gdGhlIGdpdmVuIHNvdXJjZSBmaWxlIHRvCi0JICogdGhlIGdpdmVuIGRlc3RpbmF0aW9uIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZSB0aGUgZ2l2ZW4gc291cmNlIGZpbGUKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGdpdmVuIGRlc3RpbmF0aW9uIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmZXJEYXRhKEZpbGUgc291cmNlLCBGaWxlIGRlc3RpbmF0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlkZXN0aW5hdGlvbi5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpOwotCQkJb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0aW5hdGlvbik7Ci0JCQl0cmFuc2ZlckRhdGEoaXMsIG9zKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKG9zICE9IG51bGwpewotCQkJCXRyeSB7Ci0JCQkJCW9zLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKXsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihpcyAhPSBudWxsKXsKLQkJCQl0cnkgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIENvcGllcyBhbGwgYnl0ZXMgaW4gdGhlIGdpdmVuIHNvdXJjZSBzdHJlYW0gdG8KLQkgKiB0aGUgZ2l2ZW4gZGVzdGluYXRpb24gc3RyZWFtLiBOZWl0aGVyIHN0cmVhbXMKLQkgKiBhcmUgY2xvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UgdGhlIGdpdmVuIHNvdXJjZSBzdHJlYW0KLQkgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGdpdmVuIGRlc3RpbmF0aW9uIHN0cmVhbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2ZlckRhdGEoSW5wdXRTdHJlYW0gc291cmNlLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBieXRlc1JlYWQgPSAwOwotCQl3aGlsZShieXRlc1JlYWQgIT0gLTEpewotCQkJYnl0ZXNSZWFkID0gc291cmNlLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKLQkJCWlmKGJ5dGVzUmVhZCAhPSAtMSl7Ci0JCQkJZGVzdGluYXRpb24ud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIFVuemlwcyB0aGUgZ2l2ZW4gemlwIGZpbGUgdG8gdGhlIGdpdmVuIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQotCSAqIGV4dHJhY3Rpbmcgb25seSB0aG9zZSBlbnRyaWVzIHRoZSBwYXNzIHRocm91Z2ggdGhlIGdpdmVuCi0JICogZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIgZmlsdGVycyBvdXQgdW53YW50ZWQgemlwIGVudHJpZXMKLQkgKiBAcGFyYW0gemlwRmlsZSB0aGUgemlwIGZpbGUgdG8gdW56aXAKLQkgKiBAcGFyYW0gZHN0RGlyIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW56aXAoSVppcEZpbHRlciBmaWx0ZXIsIFppcEZpbGUgemlwRmlsZSwgRmlsZSBkc3REaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXVuemlwKGZpbHRlciwgemlwRmlsZSwgZHN0RGlyLCBkc3REaXIsIDApOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuemlwKElaaXBGaWx0ZXIgZmlsdGVyLCBaaXBGaWxlIHppcEZpbGUsIEZpbGUgcm9vdERzdERpciwgRmlsZSBkc3REaXIsIGludCBkZXB0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkKLQkJRW51bWVyYXRpb24gZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOwotCQotCQl0cnkgewotCQkJd2hpbGUoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSl7Ci0JCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCWlmKGVudHJ5LmlzRGlyZWN0b3J5KCkpewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJU3RyaW5nIGVudHJ5TmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkc3REaXIsIEZpbGVUb29sLmNoYW5nZVNlcGFyYXRvcihlbnRyeU5hbWUsICcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCQkJU3RyaW5nIGZ1bGxFbnRyeU5hbWUgPSBGaWxlVG9vbC5jaGFuZ2VTZXBhcmF0b3IoZmlsZS50b1N0cmluZygpLnN1YnN0cmluZyhyb290RHN0RGlyLnRvU3RyaW5nKCkubGVuZ3RoKCkgKyAxKSwgRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQkJCWlmKCEoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLnNob3VsZEV4dHJhY3QoZnVsbEVudHJ5TmFtZSwgZW50cnlOYW1lLCBkZXB0aCkpKXsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCUlucHV0U3RyZWFtIHNyYyA9IG51bGw7Ci0JCQkJT3V0cHV0U3RyZWFtIGRzdCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJc3JjID0gemlwRmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JCQkJCWRzdCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJCQl0cmFuc2ZlckRhdGEoc3JjLCBkc3QpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmKGRzdCAhPSBudWxsKXsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZHN0LmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKHNyYyAhPSBudWxsKXsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc3JjLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKChlbnRyeU5hbWUuZW5kc1dpdGgoIi56aXAiKSB8fCBlbnRyeU5hbWUuZW5kc1dpdGgoIi5qYXIiKSkgJiYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5zaG91bGRVbnppcChmdWxsRW50cnlOYW1lLCBlbnRyeU5hbWUsIGRlcHRoKSkpIHsKLQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBkaXJOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGZpbGVOYW1lLmxlbmd0aCgpIC0gNCkgKyAiXyIgKyBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUubGVuZ3RoKCkgLSAzKTsKLQkJCQkJWmlwRmlsZSBpbm5lclppcEZpbGUgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJaW5uZXJaaXBGaWxlID0gbmV3IFppcEZpbGUoZmlsZSk7Ci0JCQkJCQlGaWxlIGlubmVyRHN0RGlyID0gbmV3IEZpbGUoZmlsZS5nZXRQYXJlbnRGaWxlKCksIGRpck5hbWUpOwotCQkJCQkJdW56aXAoZmlsdGVyLCBpbm5lclppcEZpbGUsIHJvb3REc3REaXIsIGlubmVyRHN0RGlyLCBkZXB0aCArIDEpOwotCQkJCQkJZmlsZS5kZWxldGUoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJaWYoaW5uZXJaaXBGaWxlICE9IG51bGwpewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWlubmVyWmlwRmlsZS5jbG9zZSgpOwotCQkJCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZTIpewotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IHVuemlwOiAiICsgZmlsZU5hbWUgKyAiLiBJbm5lclppcCA9ICIgKyBpbm5lclppcEZpbGUuZ2V0TmFtZSgpICsgIi4gTGVuZ2h0OiAiICsgaW5uZXJaaXBGaWxlLmdldE5hbWUoKS5sZW5ndGgoKSk7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJCi0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpewotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIFppcHMgdGhlIGdpdmVuIGRpcmVjdG9yeSB0byB0aGUgZ2l2ZW4gemlwIGZpbGUuCi0JICogRGlyZWN0b3JpZXMgYXJlIHppcHBlZCByZWN1cnNpdmVseS4gSW5uZXIgemlwIGZpbGVzIGFyZQotCSAqIGNyZWF0ZWQgZm9yIGRpcmVjdG9yaWVzIHRoYXQgZW5kIHdpdGggIl96aXAiIG9yICJfamFyIi4KLQkgKiBJZiB2ZXJib3NlIGlzIHRydWUsIHByb2dyZXNzIGluZm9ybWF0aW9uIGlzIGxvZ2dlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgdG8gemlwCi0JICogQHBhcmFtIHppcEZpbGUgdGhlIHJlc3VsdGluZyB6aXAgZmlsZQotCSAqIEBwYXJhbSB2ZXJib3NlIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgcHJvZ3Jlc3MKLQkgKiBpbmZvcm1hdGlvbiBpcyBsb2dnZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemlwKEZpbGUgZGlyLCBGaWxlIHppcEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7Ci0JCVppcE91dHB1dFN0cmVhbSB6b3MgPSBudWxsOwotCQl0cnkgewotCQkJYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHppcEZpbGUpKTsKLQkJCXpvcyA9IG5ldyBaaXBPdXRwdXRTdHJlYW0oYm9zKTsKLQkJCXppcChkaXIsIGRpciwgem9zKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKHpvcyA9PSBudWxsKXsKLQkJCQlpZihib3MgIT0gbnVsbCl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlib3MuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKXsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdHJ5IHsKLQkJCQkJem9zLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKXsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB6aXAoRmlsZSByb290LCBGaWxlIGZpbGUsIFppcE91dHB1dFN0cmVhbSB6b3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmKGZpbGUuaXNEaXJlY3RvcnkoKSl7Ci0JCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQkJaWYobmFtZS5lbmRzV2l0aCgiX3ppcCIpIHx8IG5hbWUuZW5kc1dpdGgoIl9qYXIiKSl7Ci0JCQkJU3RyaW5nIHJvb3RTdHJpbmcgPSByb290LnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBmaWxlLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHppcEVudHJ5TmFtZSA9IGZpbGVTdHJpbmcuc3Vic3RyaW5nKHJvb3RTdHJpbmcubGVuZ3RoKCkgKyAxKTsKLQkJCQlpbnQgdW5kZXJzY29yZUluZGV4ID0gemlwRW50cnlOYW1lLmxhc3RJbmRleE9mKCJfIik7Ci0JCQkJemlwRW50cnlOYW1lID0gemlwRW50cnlOYW1lLnN1YnN0cmluZygwLCB1bmRlcnNjb3JlSW5kZXgpICsgIi4iICsgemlwRW50cnlOYW1lLnN1YnN0cmluZyh1bmRlcnNjb3JlSW5kZXggKyAxKTsKLQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IG5ldyBaaXBFbnRyeShjaGFuZ2VTZXBhcmF0b3IoemlwRW50cnlOYW1lLCBGaWxlLnNlcGFyYXRvckNoYXIsICcvJykpOwotCQkJCXpvcy5wdXROZXh0RW50cnkoemlwRW50cnkpOwotCQkJCVppcE91dHB1dFN0cmVhbSB6b3MyID0gbmV3IFppcE91dHB1dFN0cmVhbSh6b3MpOwotCQkJCVN0cmluZ1tdIGxpc3QgPSBmaWxlLmxpc3QoKTsKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSl7Ci0JCQkJCUZpbGUgaXRlbSA9IG5ldyBGaWxlKGZpbGUsIGxpc3RbaV0pOwotCQkJCQl6aXAoZmlsZSwgaXRlbSwgem9zMik7Ci0JCQkJfQotCQkJCXpvczIuZmluaXNoKCk7Ci0JCQkJem9zLmNsb3NlRW50cnkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nW10gbGlzdCA9IGZpbGUubGlzdCgpOwotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKXsKLQkJCQkJRmlsZSBpdGVtID0gbmV3IEZpbGUoZmlsZSwgbGlzdFtpXSk7Ci0JCQkJCXppcChyb290LCBpdGVtLCB6b3MpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN0cmluZyByb290U3RyaW5nID0gcm9vdC50b1N0cmluZygpOwotCQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBmaWxlLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgemlwRW50cnlOYW1lID0gZmlsZVN0cmluZy5zdWJzdHJpbmcocm9vdFN0cmluZy5sZW5ndGgoKSArIDEpOwotCQkJWmlwRW50cnkgemlwRW50cnkgPSBuZXcgWmlwRW50cnkoY2hhbmdlU2VwYXJhdG9yKHppcEVudHJ5TmFtZSwgRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpKTsKLQkJCXpvcy5wdXROZXh0RW50cnkoemlwRW50cnkpOwotCQkJRmlsZUlucHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWZvcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQkJdHJhbnNmZXJEYXRhKGZvcywgem9zKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYoZm9zICE9IG51bGwpewotCQkJCQl0cnkgewotCQkJCQkJZm9zLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl6b3MuY2xvc2VFbnRyeSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90ZXN0cy9wZXJmbXMvVUlUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rlc3RzL3BlcmZtcy9VSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU4MTdiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rlc3RzL3BlcmZtcy9VSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzLnBlcmZtczsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuUGVyZk1zckNvcmVQbHVnaW47Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuVXBsb2FkOwotCi1wdWJsaWMgY2xhc3MgVUlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7Ci0JCXRlc3RQZXJmbXMoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JLy8JVXBsb2FkLlN0YXR1cyBzdGF0dXMgPSBQZXJmTXNyQ29yZVBsdWdpbi5nZXRQZXJmb3JtYW5jZU1vbml0b3IodHJ1ZSkudXBsb2FkKG51bGwpOwotCS8vCVN5c3RlbS5vdXQucHJpbnRsbihzdGF0dXMubWVzc2FnZSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RQZXJmbXMoKSB7Ci0JCS8qCi0JCSAqIHRoaXMgdGVzdCB0YWtlcyBzbmFwc2hvdHMgYmVmb3JlICgxKSBhbmQgYWZ0ZXIgKDIpIG9wZW5pbmcgdGhlIEphdmEKLQkJICogUGVyc3BlY3RpdmUuIFRoZSBkZWx0YSBiZXR3ZWVuIHNuYXBzaG90cyBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHRpbWUgcmVxdWlyZWQgdG8gb3BlbgotCQkgKiB0aGUgSmF2YSBwZXJzcGVjdGl2ZS4gIERpc2FibGVkIGZvciBub3cgc2luY2UgdGhlIEVjbGlwc2VUZXN0UnVubmVyIGlzIGluc3RydW1lbnRlZCBmb3IgcGVyZm9ybWFuY2UKLQkJICogbW9uaXRvcmluZy4KLQkJICovCi0JCXRyeSB7Ci0JIAkvLwlQZXJmTXNyQ29yZVBsdWdpbi5nZXRQZXJmb3JtYW5jZU1vbml0b3IodHJ1ZSkuc25hcHNob3QoMSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLm9wZW5Xb3JrYmVuY2hXaW5kb3coCi0JCQkJCSJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVBlcnNwZWN0aXZlIiwgbnVsbCk7Ci0JCS8vCVBlcmZNc3JDb3JlUGx1Z2luLmdldFBlcmZvcm1hbmNlTW9uaXRvcih0cnVlKS5zbmFwc2hvdCgyKTsKLQkJfSBjYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMvdGVzdC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q5ZGU5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHByb2plY3QgbmFtZT0iUmVsRW5nIEF1dG9tYXRlZCBUZXN0cyIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLQotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLi8iLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxvY2F0aW9uIiB2YWx1ZT0iL2J1aWxkcy90Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJvcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMiIHZhbHVlPSJvcmcuZWNsaXBzZS5yZWxlbmcudGVzdHNfMy4wLjAiIC8+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgdGhlIHRlc3RzIC0tPgotICA8IS0tIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdG8gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtsb2NhdGlvbn0iIHF1aWV0PSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiBhZnRlciBhbGwgLS0+Ci0gIDwhLS0gdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzLnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9IkJ1aWxkVGVzdHMiIGRlcGVuZHM9ImluaXQsY2xlYW51cCIgdW5sZXNzPSJwZXJmb3JtYW5jZSI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2xvY2F0aW9ufSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzLkJ1aWxkVGVzdHMiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7b3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzfSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImJlbmNobWFyayIgZGVwZW5kcz0iaW5pdCxjbGVhbnVwIiBpZj0icGVyZm9ybWFuY2UiPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9InBlcmZvcm1hbmNlIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5yZWxlbmcudGVzdHMucGVyZm1zLlVJVGVzdCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtvcmcuZWNsaXBzZS5yZWxlbmcudGVzdHN9Ii8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiIGRlcGVuZHM9ImJlbmNobWFyayxCdWlsZFRlc3RzIi8+Ci0gPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyMmM5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi10b29scy5qYXIKLWJpbgotb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzXyouemlwCi10b29sc3NyYy56aXAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZjI0M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29tcGFyZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ib290PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamZhY2UudGV4dDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudGVhbS5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS50ZWFtLmN2cy51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudGVhbS51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLmVkaXRvcnM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLmlkZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkudmlld3M8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9UZXN0Q2FzZXMuZG9jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvVGVzdENhc2VzLmRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2Y2M2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9UZXN0Q2FzZXMuZG9jCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjQxMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4yMHRoIEp1bmUsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2Jvb2suY3NzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvYm9vay5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNzhjZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvYm9vay5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotUC5Db2RlIHsNCi0JZGlzcGxheTogYmxvY2s7DQotCXRleHQtYWxpZ246IGxlZnQ7DQotCXRleHQtaW5kZW50OiAwLjAwcHQ7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDE1cHQ7DQotCWZvbnQtc2l6ZTogMTAuMDAwMDAwcHQ7DQotCWZvbnQtd2VpZ2h0OiBtZWRpdW07DQotCWZvbnQtc3R5bGU6IFJlZ3VsYXI7DQotCWNvbG9yOiAjNDQ0NENDOw0KLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsNCi0JdGV4dC10cmFuc2Zvcm06IG5vbmU7DQotCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciOw0KLX0NCi1INi5DYXB0aW9uRmlnQ29sdW1uIHsNCi0JZGlzcGxheTogYmxvY2s7DQotCXRleHQtYWxpZ246IGxlZnQ7DQotCXRleHQtaW5kZW50OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tdG9wOiAzLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAxMS4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsNCi0JZm9udC1zaXplOiA5LjAwMDAwMHB0Ow0KLQlmb250LXdlaWdodDogbWVkaXVtOw0KLQlmb250LXN0eWxlOiBJdGFsaWM7DQotCWNvbG9yOiAjMDAwMDAwOw0KLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsNCi0JdGV4dC10cmFuc2Zvcm06IG5vbmU7DQotCWZvbnQtZmFtaWx5OiAiQXJpYWwiOw0KLX0NCi1QLk5vdGUgew0KLQlkaXNwbGF5OiBibG9jazsNCi0JdGV4dC1hbGlnbjogbGVmdDsNCi0JdGV4dC1pbmRlbnQ6IDBwdDsNCi0JbWFyZ2luLXRvcDogMTkuNTAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDE5LjUwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAzMHB0Ow0KLQlmb250LXNpemU6IDExLjAwMDAwMHB0Ow0KLQlmb250LXdlaWdodDogbWVkaXVtOw0KLQlmb250LXN0eWxlOiBJdGFsaWM7DQotCWNvbG9yOiAjMDAwMDAwOw0KLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsNCi0JdGV4dC10cmFuc2Zvcm06IG5vbmU7DQotCWZvbnQtZmFtaWx5OiAiQXJpYWwiOw0KLX0NCi1FTS5VSUxhYmVsIHsNCi0JZm9udC13ZWlnaHQ6IEJvbGQ7DQotCWZvbnQtc3R5bGU6IFJlZ3VsYXI7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi19DQotRU0uQ29kZU5hbWUgew0KLQlmb250LXdlaWdodDogQm9sZDsNCi0JZm9udC1zdHlsZTogUmVndWxhcjsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLQlmb250LWZhbWlseToiQ291cmllciBOZXciOw0KLX0NCi0NCi0NCi0NCi0NCi0vKiBmb2xsb3dpbmcgZm9udCBmYWNlIGRlY2xhcmF0aW9ucyBuZWVkIHRvIGJlIHJlbW92ZWQgZm9yIERCQ1MgKi8NCi0NCi1ib2R5LCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBwLCB0YWJsZSwgdGQsIGNhcHRpb24sIHRoLCB1bCwgb2wsIGRsLCBsaSwgZGQsIGR0IHtmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6ICMwMDAwMDB9DQotcHJlCQkJCXsgZm9udC1mYW1pbHk6IENvdXJpZXIsIG1vbm9zcGFjZX0NCi0NCi0vKiBlbmQgZm9udCBmYWNlIGRlY2xhcmF0aW9ucyAqLw0KLQ0KLS8qIGZvbGxvd2luZyBmb250IHNpemUgZGVjbGFyYXRpb25zIHNob3VsZCBiZSBPSyBmb3IgREJDUyAqLw0KLWJvZHksIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIHAsIHRhYmxlLCB0ZCwgY2FwdGlvbiwgdGgsIHVsLCBvbCwgZGwsIGxpLCBkZCwgZHQge2ZvbnQtc2l6ZTogMTBwdDsgfQ0KLXByZQkJCQl7IGZvbnQtc2l6ZTogMTBwdH0NCi0NCi0vKiBlbmQgZm9udCBzaXplIGRlY2xhcmF0aW9ucyAqLw0KLQ0KLWJvZHkJICAgICB7IGJhY2tncm91bmQ6ICNGRkZGRkZ9DQotaDEgICAgICAgICAgIHsgZm9udC1zaXplOiAxOHB0OyBtYXJnaW4tdG9wOiA1OyBtYXJnaW4tYm90dG9tOiAxIH0JDQotaDIgICAgICAgICAgIHsgZm9udC1zaXplOiAxNHB0OyBtYXJnaW4tdG9wOiAyNTsgbWFyZ2luLWJvdHRvbTogMyB9DQotaDMgICAgICAgICAgIHsgZm9udC1zaXplOiAxMXB0OyBtYXJnaW4tdG9wOiAyMDsgbWFyZ2luLWJvdHRvbTogMyB9DQotaDQgICAgICAgICAgIHsgZm9udC1zaXplOiAxMHB0OyBtYXJnaW4tdG9wOiAyMDsgbWFyZ2luLWJvdHRvbTogMzsgZm9udC1zdHlsZTogaXRhbGljIH0NCi1wICAgICAgICAgICAgeyBtYXJnaW4tdG9wOiAxMHB4OyBtYXJnaW4tYm90dG9tOiAxMHB4IH0NCi1wcmUJICAgICB7IG1hcmdpbi1sZWZ0OiA2OyBmb250LXNpemU6IDlwdCB9DQotYTpsaW5rCSAgICAgeyBjb2xvcjogIzAwMDBGRiB9DQotYTpob3ZlcgkgICAgIHsgY29sb3I6ICMwMDAwODAgfQ0KLWE6dmlzaXRlZCAgICB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIH0NCi11bAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMTAgfQ0KLWxpCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwIH0gDQotbGkgcAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMCB9IA0KLW9sCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxMCB9DQotZGwJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDEwIH0NCi1kdAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMDsgZm9udC13ZWlnaHQ6IGJvbGQgfQ0KLWRkCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwIH0NCi1zdHJvbmcJICAgICB7IGZvbnQtd2VpZ2h0OiBib2xkfQ0KLWVtCSAgICAgeyBmb250LXN0eWxlOiBpdGFsaWN9DQotdmFyCSAgICAgeyBmb250LXN0eWxlOiBpdGFsaWN9DQotZGl2LnJldmlzaW9uIHsgYm9yZGVyLWxlZnQtc3R5bGU6IHNvbGlkOyBib3JkZXItbGVmdC13aWR0aDogdGhpbjsgDQotCQkJCSAgIGJvcmRlci1sZWZ0LWNvbG9yOiAjN0I2OEVFOyBwYWRkaW5nLWxlZnQ6NSB9DQotdGgJICAgICB7IGZvbnQtd2VpZ2h0OiBib2xkIH0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmNjE0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLnRvb2xzLmphciA9IHNyYy8KLWJpbi5pbmNsdWRlcz1wbHVnaW4ueG1sLCouamFyLGFib3V0Lmh0bWwsaWNvbnMvLHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDAxLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDAxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OWFmOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAwMS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk5vIE1hcCBQcm9qZWN0IEV4aXN0czwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD4KLTxib2R5PgotPGgyPk5vIE1hcCBQcm9qZWN0IEV4aXN0czwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD4KLTxoMz5QcmVjb25kaXRpb246PC9oMz4KLTxvbD4KLQk8bGk+VGhlcmUgaXMgbm8gcHJvamVjdDEgaW4gY3VycmVudCB3b3Jrc3BhY2U8L2xpPgotCTxsaT5UaGVyZSBpcyAibm8gb3JnLmVjbGlwc2Uub3JnIiBpbiBjdXJyZW50IHdvcmtzcGFjZTwvbGk+Ci08L29sPgotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+Q3JlYXRlIHByb2plY3QgInByb2plY3QxIjwvbGk+Ci0JPGxpPkNvbW1pdCBwcm9qZWN0MSB0byBhIENWUyBzZXJ2ZXI8L2xpPgotCTxsaT5TZWxlY3QgcHJvamVjdDEgYW5kIHJlbGVhc2UuIDwvbGk+CQotPC9vbD4JCi08aDM+RXhwZWN0ZWQgUmVzdWx0OjwvaDM+Ci1FcnJvciBvY2N1cnMgaW5kaWNhdGluZyB0aGVyZSBpcyBubyBtYXAgcHJvamVjdAotCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDAyLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDAyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNjU3YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAwMi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPkludGVncmF0ZWQgVGVzdHMgZm9yIERlZmF1bHQgU2V0dGluZ3M8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPkludGVncmF0ZWQgVGVzdHMgZm9yIERlZmF1bHQgU2V0dGluZ3M8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLUFuc3dlciBjb21lcyBoZXJlLgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAwMy5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAwMy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjYxM2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMDMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5JbnRlZ3JhdGVkIFRlc3RzIGZvciBWYXJpYXRpb25zPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5JbnRlZ3JhdGVkIFRlc3RzIGZvciBWYXJpYXRpb25zPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotCi1BbnN3ZXIgY29tZXMgaGVyZS4KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMDQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMDQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1ZWU5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDA0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+Tm8gTWFwIEZpbGUgRXhpc3RzPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5ObyBNYXAgRmlsZSBFeGlzdHM8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLTxoMz5QcmVjb25kaXRpb246PC9oMz4KLTxvbD4KLQk8bGk+cHJvamVjdDEgZXhpc3RzIGFuZCBpcyBjb21taXR0ZWQ8L2xpPgotCTxsaT4ib3JnLmVjbGlwc2Uub3JnIiBleGlzdHM8L2xpPgotCTxsaT5ObyBmb2xkZXIgb2YgIm1hcHMiIHVuZGVyICJvcmcuZWNsaXBzZS5vcmciPC9saT4KLTwvb2w+Ci08aDM+VGVzdCBTdGVwczo8L2gzPgotPG9sPgotCTxsaT5DcmVhdGUgYSAibWFwcyIgZm9sZGVyIHVuZGVyIHRoZSBtYXAgcHJvamVjdDwvbGk+Ci0JPGxpPlNlbGVjdGVkIHByb2plY3QxIGFuZCByZWxlYXNlPC9saT4KLTwvb2w+CQkKLTxoMz5FeHBlY3RlZCBSZXN1bHQ6IDwvaDM+Ci1FcnJvciBvY2N1cnMgaW5kaWNhdGluZyB0aGVyZSBpcyBubyB2YWxpZCBtYXAgZmlsZSBvciBtYXAgZW50cnkKLQotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAwNS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAwNS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODRiOTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMDUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5FbXB0eSBNYXAgRmlsZXM8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPkVtcHR5IE1hcCBGaWxlczwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotPGgzPlByZWNvbmRpdGlvbjo8L2gzPgotPG9sPgotCTxsaT5wcm9qZWN0MSBleGlzdHMgYW5kIGlzIGNvbW1pdHRlZDwvbGk+Ci0JPGxpPiJvcmcuZWNsaXBzZS5vcmcvbWFwcyIgZXhpc3RzIGJ1dCBlbXB0eTwvbGk+Ci08L29sPgotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLQk8bGk+QWRkIG1hcDEubWFwIHVuZGVyIGZvbGRlciBtYXBzLjwvbGk+Ci0JPGxpPk1ha2Ugc3VyZSB0aGUgZmlsZSBpcyBlbXB0eTwvbGk+Ci0JPGxpPlNlbGVjdGVkIHByb2plY3QxIGFuZCByZWxlYXNlPC9saT4KLTxoMz5FeHBlY3RlZCBSZXN1bHQ6IDwvaDM+Ci1FcnJvciBvY2N1cnMgaW5kaWNhdGluZyB0aGVyZSBpcyBubyB2YWxpZCBtYXAgZmlsZSBvciBtYXAgZW50cnkKLQotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAwNi5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAwNi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmM0ZDZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMDYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5VbnNoYXJlZCBNYXAgUHJvamVjdDwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+VW5zaGFyZWQgTWFwIFByb2plY3Q8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLTxoMz5QcmVjb25kaXRpb246PC9oMz4KLTxvbD4KLQk8bGk+cHJvamVjdDEgZXhpc3RzIGFuZCBpcyBjb21taXR0ZWQgCi0JPGxpPm1hcDEubWFwIGZpbGUgZXhpc3RzIGluICJvcmcuZWNsaXBzZS5vcmciIGJ1dCBpcyBlbXB0eQotCTxsaT4ib3JnLmVjbGlwc2Uub3JnIiBpcyBub3Qgc2hhcmVkCi08L29sPgotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+QWRkIHBsdWdpbkBwcm9qZWN0MT12NDA0LDpwc2VydmVyOnpsaXVAMTI3LjAuMC4xOmM6L2N2c250LCB0byBtYXAxLm1hcAotCTxsaT5TYXZlIG1hcDEubWFwCi0JPGxpPlNlbGVjdGVkIHByb2plY3QxIGFuZCByZWxlYXNlCi08L29sPgotPGgzPkV4cGVjdGVkIFJlc3VsdDo8L2gzPgotCUVycm9yIG1lc3NhZ2Ugb2YgdW5jb21taXR0ZWQgbWFwIHByb2plY3QgYXBwZWFycy4gCi0KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMDcuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMDcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiYTZhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDA3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TWFwIEVudHJpZXMgYW5kIENWUyBNb2R1bGUgTmFtZTwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+TWFwIEVudHJpZXMgYW5kIENWUyBNb2R1bGUgTmFtZTwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotPGgzPlByZWNvbmRpdGlvbjo8L2gzPgotPG9sPgotCTxsaT5wcm9qZWN0MSwgcHJvamVjdDIgZXhpc3QgaW4gd29ya3NwYWNlPC9saT4KLQk8bGk+cHJvamVjdDEgaXMgY29tbWl0dGVkIGFzICJwcm9qZWN0MSI8L2xpPgotCTxsaT5wcm9qZWN0MiBpcyBjb21taXR0ZWQgd2l0aCBhIGRpZmZlcmVudCBDVlMgbW9kdWxlIG5hbWUgInAyIjwvbGk+Ci0JPGxpPiJvcmcuZWNsaXBzZS5vcmciIGV4aXN0cyBhbmQgc2hhcmVkPC9saT4KLQk8bGk+bWFwMS5tYXAgZXhpc3QgdW5kZXIgIm9yZy5lY2xpcHNlLm9yZy9tYXBzIjwvbGk+Ci08L29sPgotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+QWRkIG1hcCBlbnRyaWVzIGluIG1hcDEubWFwICJwbHVnaW5AcHJvamVjdDE9djEsOnBzZXJ2ZXI6emxpdUAxMjcuMC4wLjE6YzovY3ZzbnQsIiBhbmQgInBsdWdpbkBoYWhhaGE9djEsOnBzZXJ2ZXI6emxpdUAxMjcuMC4wLjE6YzovY3ZzbnQsLHAyIjwvbGk+Ci0JPGxpPlNlbGVjdCBwcm9qZWN0MSBhbmQgcHJvamVjdCAyIGFuZCByZWxlYXNlIDwvbGk+Ci08L29sPgotPGgzPkV4cGVjdGVkIFJlc3VsdDogPC9oMz4KLTxvbD4KLQk8bGk+UmVsZWFzZSB3aXphcmQgc3RhcnRzIHVwCi0JPGxpPnByb2plY3QxIGFuZCBwcm9qZWN0MiBhcmUgc2hvd24gYW5kIGJlY29tZSBzZWxlY3RhYmxlIGluIFByb2plY3QgU2VsZWN0aW9uIFBhZ2UKLTwvb2w+Ci0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDA4Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDA4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZWFmZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAwOC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1hcCBFbnRyaWVzIENvbnRhaW4gTm8tZXhpc3RpbmcgUHJvamVjdHM8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPk1hcCBFbnRyaWVzIENvbnRhaW4gTm8tZXhpc3RpbmcgUHJvamVjdHM8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci08aDM+UHJlY29uZGl0aW9uOjwvaDM+Ci08b2w+Ci0JPGxpPnByb2plY3QxLCBwcm9qZWN0MiBleGlzdCBpbiB3b3Jrc3BhY2UgYW5kIGNvbW1pdHRlZDwvbGk+Ci0JPGxpPiJvcmcuZWNsaXBzZS5vcmcvbWFwcyIgZXhpc3RzIGFuZCBjb21taXR0ZWQ8L2xpPgotCTxsaT5tYXAxLm1hcCBleGlzdCB1bmRlciAib3JnLmVjbGlwc2Uub3JnL21hcHMiPC9saT4KLQk8bGk+cHJvamVjdDEgYW5kIHByb2plY3QyIGhhdmUgdmFsaWQgZW50cmllcyBpbiBtYXAxLm1hcDwvbGk+Ci08L29sPgotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+QWRkIG1hcCBlbnRyeSBpbiBtYXAxLm1hcCAicGx1Z2luQHByb2plY3QxMT12MSw6cHNlcnZlcjp6bGl1QDEyNy4wLjAuMTpjOi9jdnNudCwiPC9saT4gIAotCTxsaT5BZGQgcHJvamVjdDkgYW5kIHByb2plY3QgMTEgaW4gd29ya3NwYWNlIGJ1dCBkb24ndCBzaGFyZSB0aGVtPC9saT4KLQk8bGk+U3RhcnQgcmVsZWFzZSB3aXphcmQ8L2xpPgotPC9vbD4KLTxoMz5FeHBlY3RlZCBSZXN1bHQ6IDwvaDM+Ci08b2w+Ci0JPGxpPk9ubHkgcHJvamVjdDEgYW5kIHByb2plY3QyIGFyZSBzaG93biBpbiB3aXphcmQgcGFnZTwvbGk+Ci0JPGxpPnByb2plY3Q5IGFuZCBwcm9qZWN0MTEgYXJlIG5vdCBzaG93bjwvbGk+Ci08L29sPgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAwOS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAwOS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODgyYzVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMDkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5BZGQvZGVsZXRlIE1hcCBGaWxlPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5BZGQvZGVsZXRlIE1hcCBGaWxlPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotPGgzPlByZWNvbmRpdGlvbjo8L2gzPgotPG9sPgotCTxsaT5wcm9qZWN0MSBleGlzdCBpbiB3b3Jrc3BhY2UgYW5kIGNvbW1pdHRlZDwvbGk+Ci0JPGxpPiJvcmcuZWNsaXBzZS5vcmcvbWFwcyIgZXhpc3RzIGFuZCBjb21taXR0ZWQ8L2xpPgotCTxsaT5tYXAxLm1hcCBleGlzdCB1bmRlciAib3JnLmVjbGlwc2Uub3JnL21hcHMiPC9saT4KLQk8bGk+cHJvamVjdDEgaGFzIHZhbGlkIGVudHJ5IGluIG1hcDEubWFwPC9saT4KLTwvb2w+Ci08aDM+VGVzdCBTdGVwczo8L2gzPjxvbD4KLQk8bGk+QWRkIG1hcDIubWFwIGluICJvcmcuZWNsaXBzZS5vcmcvbWFwcyI8L2xpPgotCTxsaT5BZGQgbWFwIGVudHJ5IGluIG1hcDIubWFwICJwbHVnaW5AcHJvamVjdDM9djEsOnBzZXJ2ZXI6emxpdUAxMjcuMC4wLjE6YzovY3ZzbnQsIiA8L2xpPgotCTxsaT5TYXZlIG1hcDIubWFwPC9saT4KLQk8bGk+Q29tbWl0IG1hcDIubWFwPC9saT4KLQk8bGk+QWRkIHByb2plY3QzIGluIHdvcmtzcGFjZSBhbmQgY29tbWl0IGl0PC9saT4KLQk8bGk+U3RhcnQgcmVsZWFzZSB3aXphcmQ8L2xpPgotCTxsaT5DYW5jZWwgdGhlIHdpemFyZDwvbGk+Ci0JPGxpPkRlbGV0ZSBtYXAzLm1hcDwvbGk+Ci0JPGxpPlJlc3RhcnQgdGhlIHdpemFyZDwvbGk+PC9vbD4KLTxoMz5FeHBlY3RlZCBSZXN1bHQ6IDwvaDM+PG9sPgotCTxsaT5TdGVwIDY6IG1hcDEubWFwIGFuZCBtYXAyLm1hcCB3aWxsIHNob3cgdXAuIFByb2plY3QxIGlzIHNob3dpbmcgdW5kZXIgbWFwMS5tYXAsIHByb2plY3QzIGlzIHNob3dpbmcgdW5kZXIgbWFwMi5tYXA7PC9saT4KLQk8bGk+U3RlcCA5OiBvbmx5IG1hcDEubWFwIGFuZCBwcm9qZWN0MSBhcmUgb24gdGhlIHByb2plY3Qgc2VsZWN0aW9uIHBhZ2U8L2xpPjwvb2w+Ci0KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMTAuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxMGQ3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+VGFnIFZhbGlkYXRpb248L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPlRhZyBWYWxpZGF0aW9uPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotPGgzPlByZWNvbmRpdGlvbjo8L2gzPgotCUVudGVyIFRhZyBwYWdlIGFwcGVhcnMKLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPkVudGVyIHRhZyAiMSIgaW4gRW50ZXIgVGFnIFBhZ2U8L2xpPgotCTxsaT5DaGVjayB0aGUgZXJyb3IgbWVzc2FnZSBvbiB0aGUgcGFnZTwvbGk+Ci0JPGxpPlJlLWVudGVyIHRhZyAiVjIiPC9saT4KLTwvb2w+Ci08aDM+RXhwZWN0ZWQgUmVzdWx0OjwvaDM+Ci08b2w+Ci0JPGxpPlN0ZXAxLTI6IEludmFsaWQgdGFnIGVycm9yIG1lc3NhZ2UgYXBwZWFycy4gICJOZXh0IiBhbmQgICJGaW5pc2giIGFyZSBkaXNhYmxlZDwvbGk+Ci0JPGxpPlN0ZXAgNDogRXJyb3IgbWVzc2FnZSBpcyBnb25lLiAgIk5leHQiIGFuZCAgIkZpbmlzaCIgYXJlIGVuYWJsZWQuPC9saT4KLTwvb2w+Ci0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDExLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDExLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODJhN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxMS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPkNoZWNrYm94IG9uIFByb2plY3QgU2VsZWN0aW9uIFBhZ2U8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPkNoZWNrYm94IG9uIFByb2plY3QgU2VsZWN0aW9uIFBhZ2U8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLTxoMz5QcmVjb25kaXRpb246PC9oMz4KLTxvbD4KLQk8bGk+UHJvamVjdCAxIGFuZCBwcm9qZWN0MiB3ZXJlIHJlbGVhc2UgYXQgb25jZTwvbGk+Ci0JPGxpPlByb2plY3QgMSBhbmQgcHJvamVjdCAyIGFyZSBzeW5jaHJvbml6ZWQgd2l0aCBoZWFkPC9saT4KLTwvb2w+Ci08aDM+VGVzdCBTdGVwczo8L2gzPgotPG9sPgotCTxsaT5TdGFydCB3aXphcmQ8L2xpPgotCTxsaT5DaGVjayAiUmVsZWFzZSBvbmx5IGNoYW5nZWQgcHJvamVjdHMiIDwvbGk+Ci0JPGxpPlNlbGVjdCBwcm9qZWN0IDEgYW5kIHByb2plY3QgMiBhbmQgcmVsZWFzZTwvbGk+Ci0JPGxpPkNsaWNrIG5leHQ8L2xpPgotCTxsaT5DbGljayBiYWNrPC9saT4KLQk8bGk+VW5jaGVjayAiUmVsZWFzZSBvbmx5IGNoYW5nZWQgcHJvamVjdHMiPC9saT4KLQk8bGk+Q2xpY2sgbmV4dDwvbGk+Ci0JPGxpPkNhbmNlbCB0aGUgd2l6YXJkPC9saT4KLQk8bGk+RWRpdCBwcm9qZWN0MSBhbmQgY29tbWl0IHRoZSBjaGFuZ2U8L2xpPgotCTxsaT5TdGFydCB0aGUgd2l6YXJkPC9saT4KLQk8bGk+Q2hlY2sgIlJlbGVhc2Ugb25seSBjaGFuZ2VkIHByb2plY3RzlDwvbGk+Ci0JPGxpPkNsaWNrIG5leHQ8L2xpPgotPC9vbD4KLTxoMz5FeHBlY3RlZCBSZXN1bHQ6PC9oMz4KLTxvbD4KLQk8bGk+U3RlcCA0OiBQcm9qZWN0IENvbXBhcmUgcGFnZSB3aWxsIHNob3cgbm8gY2hhbmdlZCBwcm9qZWN0cyBpbmZvcm1hdGlvbi4gQW5kICJOZXh0IiBhbmQgIkZpbmlzaCIgYnV0dG9ucyBvZiBQcm9qZWN0IENvbXBhcmUgcGFnZSBhcmUgZGlzYWJsZWQ8L2xpPgotCTxsaT5TdGVwIDc6IEVudGVyIFRhZyBwYWdlIGFwcGVhcnM8L2xpPgotCTxsaT5TdGVwIDEyOiBwcm9qZWN0MSBpcyBzaG93biBvbiB0aGUgY29tcGFyZSBlZGl0b3I8L2xpPgotPC9vbD4KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDEyLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDEyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNWY5NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxMi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk91dGdvaW5nIENoYW5nZSBQcm9tcHRpbmcgRGlhbG9nPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5PdXRnb2luZyBDaGFuZ2UgUHJvbXB0aW5nIERpYWxvZzwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotPGgzPlByZWNvbmRpdGlvbjo8L2gzPgotcHJvamVjdDEgYW5kIHByb2plY3QyIGFyZSBjb21taXR0ZWQKLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPkVkaXQgcHJvamVjdDEgYW5kIHNhdmUsIGJ1dCBkb24ndCBjb21taXQgdGhlIGNoYW5nZTwvbGk+Ci0JPGxpPkVkaXQgcHJvamV0MiBhbmQgc2F2ZSwgYnV0IGRvbid0IGNvbW1pdCB0aGUgY2hhbmdlPC9saT4KLQk8bGk+U2VsZWN0IHByb2plY3QgMSBhbmQgcHJvamVjdCAyIGFuZCByZWxlYXNlPC9saT4KLQk8bGk+Q2hlY2sgIlJlbGVhc2Ugb25seSBjaGFuZ2VkIHByb2plY3RzIjwvbGk+Ci0JPGxpPkFuc3dlciAiWWVzIiB0byBwcm9qZWN0MTwvbGk+Ci0JPGxpPkFuc3dlciAgIk5vIiB0byBwcm9qZWN0MjwvbGk+Ci0JPGxpPkNsaWNrIGJhY2s8L2xpPgotCTxsaT5DaGVjayBwcm9qZWN0MiBhZ2FpbjwvbGk+Ci0JPGxpPkFuc3dlciAgIlllcyBUbyBBbGwiPC9saT4KLQk8bGk+Q2xpY2sgZmluaXNoPC9saT4KLTwvb2w+Ci08aDM+RXhwZWN0ZWQgUmVzdWx0OjwvaDM+Ci08b2w+Ci0JPGxpPlN0ZXAgNjogcHJvamVjdDEgd2lsbCBiZSBzaG93biBvbiBQcm9qZWN0IENvbXBhcmUgcGFnZTwvbGk+Ci0JPGxpPlN0ZXAgNzogcHJvamVjdDEgaXMgY2hlY2tlZCwgcHJvamVjdDIgaXMgdW5jaGVja2VkPC9saT4KLQk8bGk+U3RlcCA5OiBwcm9qZWN0MSBhbmQgcHJvamVjdDIgd2lsbCBiZSBzaG93bjwvbGk+Ci0JPGxpPlN0ZXAgMTA6IFByb2plY3QgVmFsaWRhdGlvbiBkaWFsb2cgd2lsbCBzaG93IHRoYXQgcHJvamVjdDEgYW5kIHByb2plY3QyIGhhdmUgZGlmZmVyZW5jZTwvbGk+Ci08L29sPgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxMy5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxMy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGMyMWQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMTMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5Qcm9qZWN0IENvbXBhcmUgUGFnZTwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+UHJvamVjdCBDb21wYXJlIFBhZ2U8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLTxoMz5QcmVjb25kaXRpb246PC9oMz4KLTxvbD4KLQk8bGk+cHJvamVjdDEgaGFzIG91dGdvaW5nIGNoYW5nZXM8L2xpPgotCTxsaT5wcm9qZWN0MSBoYXMgdmFsaWQgZW50cnkgaW4gbWFwIGZpbGU8L2xpPgotCTxsaT4ib3JnLmVjbGlwc2Uub3JnIiBpcyBjb21taXR0ZWQ8L2xpPgotCTxsaT4iUmVsZWFzZSBvbmx5IGNoYW5nZWQgcHJvamVjdHMiIGlzIGNoZWNrZWQgb24gUHJvamVjdCBTZWxlY3Rpb24gUGFnZTwvbGk+Ci08L29sPgotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+U3RhcnQgd2l6YXJkPC9saT4KLQk8bGk+U2VsZWN0IHByb2plY3QxIHRvIHJlbGVhc2U8L2xpPgotCTxsaT5DbGljayBuZXh0PC9saT4KLQk8bGk+QW5zd2VyICJ5ZXMiIDwvbGk+Ci0JPGxpPkRvdWJsZSBjbGljayBwcm9qZWN0MSB0byBvcGVuIGEgY29tcGFyZSBlZGl0b3I8L2xpPgotPC9vbD4KLTxoMz5FeHBlY3RlZCBSZXN1bHQ6PC9oMz4KLTxvbD4KLQk8bGk+UHJvamVjdDEgYXBwZWFycyBvbiBQcm9qZWN0IENvbXBhcmUgcGFnZTwvbGk+Ci0JPGxpPlRoZSBjb21wYXJlIGVkaXRvciBzaG93cyB0aGUgY29tcGFyaXNvbiBzYW1lIGFzIHByb2plY3QxIHBvcC11cCBtZW514ENvbXBhcmUgV2l0aOBSZWxlYXNlZDwvbGk+Ci08L29sPgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxNC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxNC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDY5ZDcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMTQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5Nb3ZlIFRhZyBPcHRpb24gb24gVGFnIFBhZ2U8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPk1vdmUgVGFnIE9wdGlvbiBvbiBUYWcgUGFnZTwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLTxoMz5QcmVjb25kaXRpb246PC9oMz4KLTxvbD4KLQk8bGk+cHJvamVjdDEgZXhpc3RzIGFuZCAgaXMgY29tbWl0dGVkPC9saT4KLQk8bGk+UHJvamVjdDEgd2FzIHJlbGVhc2VkIHdpdGggdGFnICJWMiI8L2xpPgotCTxsaT5wcm9qZWN0MSBoYXMgdmFsaWQgZW50cmllcyBpbiBtYXAxLm1hcDwvbGk+Ci0JPGxpPiJvcmcuZWNsaXBzZS5vcmciIGlzIGNvbW1pdHRlZDwvbGk+Ci08L29sPgotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+RWRpdCBwcm9qZWN0MTwvbGk+Ci0JPGxpPkNvbW1pdCB0aGUgY2hhbmdlPC9saT4KLQk8bGk+U3RhcnQgV2l6YXJkPC9saT4KLQk8bGk+U2VsZWN0IHByb2plY3QxPC9saT4KLQk8bGk+VW5jaGVjayAiUmVsZWFzZSBvbmx5IGNoYW5nZWQgcHJvamVjdHMiIG9uIFByb2plY3QgU2VsZWN0aW9uIHBhZ2U8L2xpPgotCTxsaT5FbnRlciAiVjIiIG9uIFRhZyBwYWdlPC9saT4KLQk8bGk+VW5jaGVjayAiTW92ZSBUYWcgaWYgaXQgYWxyZWFkeSBleGlzdHMiIG9uIFRhZyBwYWdlPC9saT4KLQk8bGk+Q2xpY2sgRmluaXNoPC9saT4KLQk8bGk+Q2xpY2sgYmFjazwvbGk+Ci0JPGxpPkNoZWNrICJNb3ZlIFRhZyBpZiBpdCBhbHJlYWR5IGV4aXN0cyIgb24gVGFnIHBhZ2U8L2xpPgotCTxsaT5DbGljayBmaW5pc2g8L2xpPgotPC9vbD4KLTxoMz5FeHBlY3RlZCBSZXN1bHQ6PC9oMz4KLTxvbD4KLQk8bGk+U3RlcCA4OiBFcnJvciBtZXNzYWdlIHNheXMgdjEgYWxyZWFkeSBleGlzdHMgYW5kIGNhbm5vdCBtb3ZlPC9saT4KLQk8bGk+U3RlcCA5OiBSZWxlYXNlIHN1Y2NlZWRzIDwvbGk+Ci08L29sPgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxNS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxNS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2E2OWMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMTUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5WYWxpZGF0ZSBPcHRpb24gb24gVGFnIFBhZ2U8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPlZhbGlkYXRlIE9wdGlvbiBvbiBUYWcgUGFnZTwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotPGgzPlByZWNvbmRpdGlvbjo8L2gzPgotPG9sPgotCTxsaT5wcm9qZWN0MSB3YXMgcmVsZWFzZWQgd2l0aCB0YWcgdjEgbGFzdCB0aW1lPC9saT4KLQk8bGk+cHJvamVjdDEgaXMgY29tbWl0dGVkPC9saT4KLTwvb2w+Ci08aDM+VGVzdCBTdGVwczo8L2gzPgotPG9sPgotCTxsaT5FZGl0IHByb2plY3QxIGFuZCBzYXZlLCBkb26SdCBjb21taXQ8L2xpPgotCTxsaT5TdGFydCB3aXphcmQ8L2xpPgotCTxsaT5TZWxlY3QgcHJvamVjdCAxIHRvIHJlbGVhc2U8L2xpPgotCTxsaT5FbnRlciB2MiBvbiB0YWcgcGFnZTwvbGk+Ci0JPGxpPkNoZWNrICJ2YWxpZGF0ZSByZWxlYXNlIjwvbGk+Ci0JPGxpPkNsaWNrIGZpbmlzaDwvbGk+Ci08L29sPgotPGgzPkV4cGVjdGVkIFJlc3VsdDo8L2gzPgotcHJvamVjdDEgd2lsbCBzaG93IHVwIGluZGljYXRpbmcgaXQgaGFzIGRpZmZlcmVuY2UKLQotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxNi5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxNi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDRiMjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMTYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5TaG93IE1hcCBGaWxlIENoYW5nZSBPcHRpb24gb24gVGFnIHBhZ2U8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPlNob3cgTWFwIEZpbGUgQ2hhbmdlIE9wdGlvbiBvbiBUYWcgcGFnZTwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLTxoMz5QcmVjb25kaXRpb246PC9oMz4KLTxvbD4KLQk8bGk+UHJvamVjdDEgd2FzIHJlbGVhc2VkIGFzIHYyIGxhc3QgdGltZTwvbGk+Ci0JPGxpPlByb2plY3QyIHdhcyByZWxlYXNlZCBhcyB2MSBsYXN0IHRpbWU8L2xpPgotPC9vbD4KLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPlN0YXJ0IHdpemFyZDwvbGk+Ci0JPGxpPlVuY2hlY2sgIlJlbGVhc2Ugb25seSBjaGFuZ2VkIHByb2plY3RzIjwvbGk+Ci0JPGxpPlNlbGVjdCBwcm9qZWN0MSBhbmQgcHJvamVjdDI8L2xpPgotCTxsaT5FbnRlciAidjIiIG9uIFRhZyBQYWdlPC9saT4KLQk8bGk+Q2hlY2sgIk1vdmUgdGFnIGlmIGl0IGFscmVhZHkgZXhpc3RzIjwvbGk+Ci0JPGxpPlNlbGVjdCAiU2hvdyB0aGUgbWFwIGZpbGUgY2hhbmdlIGJlZm9yZSBjb21taXR0aW5nIjwvbGk+Ci0JPGxpPkNsaWNrIG5leHQ8L2xpPgotCTxsaT5DbGljayBiYWNrPC9saT4KLQk8bGk+TW9kaWZ5IHRoZSB0YWcgYXMgInYzIjwvbGk+Ci0JPGxpPkNsaWNrIGZpbmlzaDwvbGk+Ci08L29sPgotPGgzPkV4cGVjdGVkIFJlc3VsdDo8L2gzPgotPG9sPgotCTxsaT5TdGVwIDc6IE1hcCBjb21wYXJlIHBhZ2Ugd2lsbCBzaG93IHRoZSBkaWZmZXJlbmNlIG9mIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCBwcm9qZWN0MjwvbGk+Ci0JPGxpPlN0ZXAgOTogTWFwIGNvbXBhcmUgcGFnZSB3aWxsIHNob3cgdGhlIGRpZmZlcmVuY2Ugb2YgZW50cmllcyBhc3NvY2lhdGVkIHdpdGggYm90aCBwcm9qZWN0MSBhbmQgcHJvamVjdDI8L2xpPgotCTxsaT5TdGVwIDEwOiBMb2NhbCB0YWdzIG9mIHByb2plY3QxIGFuZCBwcm9qZWN0MiBhcmUgY2hhbmdlZCB0byB2MywgbWFwIHByb2plY3QgaXMgY29tbWl0dGVkIGFuZCBwcm9qZWN0MSBhbmQgcHJvamVjdDIgYXJlIHJlbGVhc2VkIHN1Y2Vzc2Z1bGx5PC9saT4KLTwvb2w+Ci0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDE3Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDE3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZTk5MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxNy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPkNvbW1pdCBEaXJlY3RseSBPcHRpb24gb24gVGFnIFBhZ2UgPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5Db21taXQgRGlyZWN0bHkgT3B0aW9uIG9uIFRhZyBQYWdlIDwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLTxoMz5QcmVjb25kaXRpb246PC9oMz4KLVByb2VqY3QxIHdhcyByZWxlYXNlZCBhcyB2MiBsYXN0IHRpbWUKLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPlN0YXJ0IHdpemFyZDwvbGk+Ci0JPGxpPlVuY2hlY2sgIlJlbGVhc2Ugb25seSBjaGFuZ2VkIHByb2plY3RzIjwvbGk+Ci0JPGxpPlNlbGVjdCBwcm9qZWN0MTwvbGk+Ci0JPGxpPkVudGVyICJ2NCIgb24gVGFnIFBhZ2U8L2xpPgotCTxsaT5DaGVjayAiTW92ZSB0YWcgaWYgaXQgYWxyZWFkeSBleGlzdHMiPC9saT4KLQk8bGk+U2VsZWN0ICJDb21taXQgdGhlIG1hcCBmaWxlcyB3aXRob3V0IHNob3dpbmcgY2hhbmdlcyI8L2xpPgotCTxsaT5DbGljayBmaW5pc2g8L2xpPgotPC9vbD4KLTxoMz5FeHBlY3RlZCBSZXN1bHQ6PC9oMz4KLTxvbD4KLQk8bGk+Tm8gbWFwIGNvbXBhcmUgcGFnZSBzaG93cyB1cDwvbGk+Ci0JPGxpPkxvY2FsIHRhZyBmb3IgcHJvamVjdDEgaXMgY2hhbmdlZCB0byB2MzwvbGk+Ci0JPGxpPk1hcCBwcm9qZWN0IGlzIGNvbW1pdHRlZDwvbGk+Ci0JPGxpPlByb2plY3QxIGlzIHJlbGVhc2VkIGFzIHYzIDwvbGk+Ci08L29sPgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxOC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxOC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjM1YmMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMTguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5Db21taXQgQ29tbWVudCBQYWdlPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5Db21taXQgQ29tbWVudCBQYWdlPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotPGgzPlByZWNvbmRpdGlvbjo8L2gzPgotUHJvZWpjdDEgd2FzIHJlbGVhc2VkIGFzIHYyIGxhc3QgdGltZQotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+U3RhcnQgd2l6YXJkPC9saT4KLQk8bGk+VW5jaGVjayAiUmVsZWFzZSBvbmx5IGNoYW5nZWQgcHJvamVjdHMiPC9saT4KLQk8bGk+U2VsZWN0IHByb2plY3QxPC9saT4KLQk8bGk+RW50ZXIgInY0IiBvbiBUYWcgUGFnZTwvbGk+Ci0JPGxpPkNoZWNrICJNb3ZlIHRhZyBpZiBpdCBhbHJlYWR5IGV4aXN0cyI8L2xpPgotCTxsaT5DbGljayBOZXh0PC9saT4KLQk8bGk+RW50ZXIgY29tbWVudCAidGVzdCBjb21tZW50IjwvbGk+Ci0JPGxpPkNsaWNrIGZpbmlzaDwvbGk+Ci08L29sPgotPGgzPkV4cGVjdGVkIFJlc3VsdDo8L2gzPgotRnJvbSBtYXAxLm1hcCBwb3AtdXAgbWVudS0+VGVhbS0+U2hvdyAgSW4gcmVzb3VyY2UgSGlzdG9yeSwgeW91IHdpbGwgc2VlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBtYXAxLm1hcCBoYXMgY29tbWVudCCTdGVzdCBjb21tZW50lAotCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDE5Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDE5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYTAwN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAxOS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1hcCBwcm9qZWN0IGhhcyBvdGhlciB0eXBlIG9mIGZpbGVzPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5NYXAgcHJvamVjdCBoYXMgb3RoZXIgdHlwZSBvZiBmaWxlczwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLTxoMz5QcmVjb25kaXRpb246PC9oMz4KLTxvbD4KLQk8bGk+TWFwUHJvamVjdCBleGlzdHMgYW5kIG1hcDEubWFwIGV4aXN0czwvbGk+Ci0JPGxpPk1hcCBwcm9qZWN0IGlzIGNvbW1pdHRlZDwvbGk+Ci08L29sPgotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+QWRkIGEgZmlsZSAiYWFhLnR4dCIgaW4gbWFwIGZvbGRlcjwvbGk+Ci0JPGxpPkNvbW1pdCAiYWFhLnR4dCI8L2xpPgotCTxsaT5BZGQgYSBmaWxlICJiYmIiIGluIG1hcCBmb2xkZXI8L2xpPgotCTxsaT5TdGFydCBXaXphcmQ8L2xpPgotPC9vbD4KLTxoMz5FeHBlY3RlZCBSZXN1bHRzOjwvaDM+Ci08b2w+Ci0JPGxpPm1hcDEubWFwLCBtYXAyLm1hcCBhbmQgbWFwMy5tYXAgYXJlIHNob3duIG9uIHdpemFyZDwvbGk+Ci0JPGxpPmFhYS50eHQgYW5kIGJiYiBkbyBub3Qgc2hvdyB1cDwvbGk+Ci08L29sPgotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMjAuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMjAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzMjI3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDIwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+QWJvdXQgRGVmYXVsdCBTZXR0aW5nczwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+QWJvdXQgRGVmYXVsdCBTZXR0aW5nczwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotVGhlIGRlZmF1bHQgc2V0dGluZyBtZWFuczoKLTxvbD4KLTxsaT5VbmNoZWNrICCTUmVsZWFzZSBvbmx5IHRoZSBwcm9qZWN0cyBjaGFuZ2VkIHNpbmNlIGxhc3QgcmVsZWFzZZQgb24gcHJvamVjdCBzZWxlY3Rpb24gcGFnZTwvbGk+Ci08bGk+VW5jaGVjayCTTW92aW5nIHRhZyBpZiBpdCBleGlzdHOUIG9uIGVudGVyIHRhZyBwYWdlPC9saT4KLTxsaT5DaGVjayCTVmFsaWRhdGUgcmVsZWFzZZQgb24gZW50ZXIgdGFnIHBhZ2UsIGFuZCA8L2xpPgotPGxpPlNlbGVjdCBDb21wYXJlIG1hcCBmaWxlcyBvbiBlbnRlciB0YWcgcGFnZSA8L2xpPiAKLTwvb2w+Ci0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDIxLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDIxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTYxNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAyMS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPkFsbCBQcm9qZWN0cyBIYXZlIE5vIE91dGdvaW5nIENoYW5nZSA8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPkFsbCBQcm9qZWN0cyBIYXZlIE5vIE91dGdvaW5nIENoYW5nZSA8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLTxoMz5QcmVjb25kaXRpb246PC9oMz4KLTxvbD4KLQk8bGk+UHJvamVjdDEsIHByb2plY3QyIGFuZCBwcm9qZWN0MyBhcmUgY29tbWl0dGVkPC9saT4KLQk8bGk+UHJvamVjdDEsIHByb2plY3QyIGFuZCBwcm9qZWN0MyBkbyBub3QgaGF2ZSBvdXRnb2luZyBjaGFuZ2VzPC9saT4KLQk8bGk+UHJvamVjdDEsIHByb2plY3QyIGFuZCBwcm9qZWN0MyB3ZXJlIHJlbGVhc2VkIHdpdGggdGFnIJNWMpQ8L2xpPgotCTxsaT5NYXAgcHJvamVjdCBoYXMgbWFwMS5tYXAsIG1hcDIubWFwIGFuZCBtYXAzLm1hcDwvbGk+Ci0JPGxpPk1hcCBwcm9qZWN0IGlzIGNvbW1pdHRlZDwvbGk+Ci0JPGxpPlRoZSBwcm9qZWN0cyBhbmQgZW50cmllcyBoYXZlIHRoZSBtYXBwaW5nIHJlbGF0aW9uIHNob3duIGluIHRhYmxlIGJlbG93PC9saT4KLTwvb2w+Ci08aDM+VGVzdCBTdGVwczo8L2gzPgotPG9sPgotCTxsaT5TdGFydCB3aXphcmQ8L2xpPgotCTxsaT5TZWxlY3QgcHJvamVjdDEsIHByb2plY3QyIGFuZCBwcm9qZWN0MzwvbGk+Ci0JPGxpPkNoZWNrICJSZWxlYXNlIG9ubHkgdGhlIGNoYW5nZWQgcHJvamVjdHMiPC9saT4KLQk8bGk+Q2xpY2sgbmV4dDwvbGk+Ci0JPGxpPkNsaWNrIGJhY2s8L2xpPgotCTxsaT5VbmNoZWNrIJNSZWxlYXNlIG9ubHkgdGhlIGNoYW5nZWQgcHJvamVjdHOUPC9saT4KLQk8bGk+Q2xpY2sgbmV4dDwvbGk+Ci0JPGxpPkVudGVyIHRhZyAidjMiPC9saT4KLQk8bGk+TWFrZSBzdXJlICAiTW92ZSB0YWcgaWYgaXQgYWxyZWFkeSBleGlzdHMiIHVuY2hlY2tlZDwvbGk+Ci0JPGxpPk1ha2Ugc3VyZSAgIlZhbGlkYXRlIHJlbGVhc2UiIGNoZWNrZWQ8L2xpPgotCTxsaT5NYWtlIHN1cmUgIlNob3cgdGhlIG1hcCBmaWxlIGNoYW5nZSBiZWZvcmUgY29tbWl0dGluZyI8L2xpPgotCTxsaT5DbGljayBuZXh0PC9saT4KLQk8bGk+Q2xpY2sgbmV4dDwvbGk+Ci0JPGxpPkNvbW1lbnQgYXMgIlJlbGVhc2UgdW5jaGFuZ2VkIHByb2plY3Rzl3JlbGVhc2UgYW55d2F5IiA8L2xpPgotCTxsaT5DbGljayBmaW5pc2g8L2xpPgotPC9vbD4KLTxoMz5FeHBlY3RlZCBSZXN1bHRzOjwvaDM+Ci08b2w+Ci0JPGxpPlN0ZXAgNDogUHJvamVjdCBDb21wYXJlIGRpYWxvZyBzaG93cyBuby1jaGFuZ2VkIHByb2plY3RzPC9saT4KLQk8bGk+U3RlcCA1OiBQcm9qZWN0IFNlbGVjdGlvbiBQYWdlIGFwcGVhcnM8L2xpPgotCTxsaT5TdGVwIDc6ICBFbnRlciBUYWcgcGFnZSBzaG93cyB1cDwvbGk+Ci0JPGxpPlN0ZXAgMTI6ICBDb21wYXJlIE1hcCBGaWxlcyBwYWdlIHNob3dzIG1hcDEubWFwIGFuZCBtYXAyLm1hcCBoYXZlIHByb3Bvc2VkIGNoYW5nZXMuIERvdWJsZSBjbGljayBtYXAxLm1hcCwgeW91IHdpbGwgZmluZCB0aGUgdGFnIG9mIHByb2plY3QxIGFuZCBwcm9qZWN0MiBpcyB2MiBhbmQgdGhlIHRhZyBpcyBwcm9wb3NlZCB0byBiZWNvbWUgdjMuIERvdWJsZSBjbGljayBtYXAyLm1hcCwgeW91IHdpbGwgc2VlIHRoZSB0YWcgb2YgcHJvamVjdDMgaXMgYWxzbyBwcm9wb3NlZCB0byBiZWNvbWUgdjMgZnJvbSB2Mi48L2xpPgotCTxsaT5TdGVwIDEzOiAgQ29tbWl0IENvbW1lbnQgcGFnZSBzaG93cyB1cC48L2xpPgotCTxsaT5TdGVwIDE1OiBXaXphcmQgZmluaXNoZXMuIEFuZCAgKGEpIHByb2plY3QxLCBwcm9qZWN0MiBhbmQgcHJvamVjdDMgYXJlIHRhZ2dlZCBhcyB2MyBpbiBsb2NhbCBtYXAgZmlsZXM7IChiKSBtYXAgcHJvamVjdCBpcyBjb21taXR0ZWQ7IChjKSBObyBkaWZmZXJlbmNlIHdpbGwgYmUgZm91bmQgYnkgY29tcGFyaW5nIGxvY2FsIGFuZCByZXBvc2l0b3J5IG1hcCBwcm9qZWN0OyAoZCkgTm8gdmFsaWRhdGlvbiBjb21wYXJpc29uIGRpYWxvZyBzaG93cyB1cDsgKGUpIENvbXBhcmUgbG9jYWwgYW5kIHYzIGluIHJlcG9zaXRvcnkgdmVyc2lvbiwgdGhlcmUgc2hvdWxkIGJlIG5vIGRpZmZlcmVuY2UgZm9yIGFsbCAzIHByb2plY3RzPC9saT4KLTwvb2w+Ci0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDIyLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDIyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYWNmZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAyMi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPkFsbCBQcm9qZWN0cyBIYXZlIE91dGdvaW5nIENoYW5nZXM8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPkFsbCBQcm9qZWN0cyBIYXZlIE91dGdvaW5nIENoYW5nZXM8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLTxoMz5QcmVjb25kaXRpb246PC9oMz4KLTxvbD4KLQk8bGk+UHJvamVjdDEsIHByb2plY3QyIGFuZCBwcm9qZWN0MyBhcmUgY29tbWl0dGVkPC9saT4KLQk8bGk+UHJvamVjdDEsIHByb2plY3QyIGFuZCBwcm9qZWN0MyB3ZXJlIHJlbGVhc2VkIHdpdGggdGFnICJWMyI8L2xpPgotCTxsaT5NYXAgcHJvamVjdCBoYXMgbWFwMS5tYXAsIG1hcDIubWFwIGFuZCBtYXAzLm1hcDwvbGk+Ci0JPGxpPk1hcCBwcm9qZWN0IGlzIGNvbW1pdHRlZDwvb2w+Ci08aDM+VGVzdCBTdGVwczo8L2gzPjxvbD4KLQk8bGk+U3RhcnQgd2l6YXJkPC9saT4KLQk8bGk+Q2hlY2sgcHJvamVjdDEsIHByb2plY3QyIGFuZCBwcm9qZWN0MzwvbGk+Ci0JPGxpPk1ha2Ugc3VyZSAgIlJlbGVhc2Ugb25seSB0aGUgY2hhbmdlZCBwcm9qZWN0cycgdW5jaGVja2VkPC9saT4KLQk8bGk+Q2xpY2sgbmV4dDwvbGk+Ci0JPGxpPkFuc3dlciB5ZXNUb0FsbDwvbGk+Ci0JPGxpPkVudGVyIHRhZyAidjQiPC9saT4KLQk8bGk+TWFrZSBzdXJlICAiTW92ZSB0YWcgaWYgaXQgYWxyZWFkeSBleGlzdHMiIHVuY2hlY2tlZDwvbGk+Ci0JPGxpPk1ha2Ugc3VyZSAgIlZhbGlkYXRlIHJlbGVhc2UiIGNoZWNrZWQ8L2xpPgotCTxsaT5NYWtlIHN1cmUgIlNob3cgbWUgdGhlIHByb3Bvc2VkIGNoYW5nZSB0aGVuIGNvbW1pdCBtYXAgZmlsZSI8L2xpPgotCTxsaT5DbGljayBuZXh0PC9saT4KLQk8bGk+Q2xpY2sgbmV4dDwvbGk+Ci0JPGxpPkNvbW1lbnQgYXMgImFsbCBoYXZlIG91dGdvaW5nIGNoYW5nZSCXcmVsZWFzZSBhbnl3YXkiIDwvbGk+Ci0JPGxpPkNsaWNrIGZpbmlzaDwvbGk+Ci0JPGxpPkNsaWNrIG9rPC9vbD48L2xpPgotPGgzPkV4cGVjdGVkIFJlc3VsdHM6PC9oMz48b2w+Ci0JPGxpPlN0ZXAgNDogIE1lc3NhZ2UgZGlhbG9nIGFwcGVhciB0byBsZXQgdXNlciBmaWx0ZXIgdGhlIHByb2plY3RzIHRvIGJlIHJlbGVhc2VkCi0JPGxpPlN0ZXAgNTogRW50ZXIgdGFnIHBhZ2Ugc2hvd3MgdXAgCi0JPGxpPlN0ZXAgOTogQ29tcGFyZSBUYWcgRmlsZXMgcGFnZSBzaG93cyBtYXAxLm1hcCBhbmQgbWFwMi5tYXAgaGF2ZSBwcm9wb3NlZCBjaGFuZ2VzCi0JPGxpPlN0ZXAgMTM6IFZhbGlkYXRpb24gZGlhbG9nIHNob3dzIHByb2plY3QxLCBwcm9qZWN0MiBhbmQgcHJvamVjdDMgYWxsIGhhdmUgY2hhbmdlcyBiZXR3ZWVuIGxvY2FsIGFuZCBuZXcgcmVsZWFzZWQgdmVyc2lvbi4KLQk8bGk+U3RlcCAxNDogV2l6YXJkIGZpbmlzaGVzLiBBbmQgIChhKSBwcm9qZWN0MSwgcHJvamVjdDIgYW5kIHByb2plY3QzIGFyZSB0YWdnZWQgYXMgdjQgaW4gbG9jYWwgbWFwIGZpbGVzOyAoYikgbWFwIHByb2plY3QgaXMgY29tbWl0dGVkOyAoYykgTm8gZGlmZmVyZW5jZSB3aWxsIGJlIGZvdW5kIGJ5IGNvbXBhcmluZyBsb2NhbCBhbmQgcmVwb3NpdG9yeSBtYXAgcHJvamVjdDsgKGQpIFByb2plY3QxLCBwcm9qZWN0MiBhbmQgcHJvamVjdDMgaGF2ZSBkaWZmZXJlbmNlcyB3aGVuIGNvbXBhcmluZyBsb2NhbCBhbmQgdjQgaW4gcmVwb3NpdG9yeSB2ZXJzaW9uCi08L29sPgotCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDIzLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDIzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTkwMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAyMy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPlNvbWUgUHJvamVjdHMgSGF2ZSBPdXRnb2luZyBDaGFuZ2VzPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5Tb21lIFByb2plY3RzIEhhdmUgT3V0Z29pbmcgQ2hhbmdlczwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotPGgzPlByZWNvbmRpdGlvbjo8L2gzPjxvbD4KLTxsaT5Qcm9qZWN0MSwgcHJvamVjdDIgYW5kIHByb2plY3QzIHdlcmUgcmVsZWFzZWQgd2l0aCB0YWcgIlY0IjwvbGk+Ci08bGk+UHJvamVjdDEgYW5kIHByb2plY3QyIGhhdmUgb3V0Z29pbmcgY2hhbmdlczwvbGk+Ci08bGk+UHJvamVjdDMgZG9lc24ndCBoYXZlIG91dGdvaW5nIGNoYW5nZXM8L2xpPgotPGxpPk1hcCBwcm9qZWN0IGlzIGNvbW1pdHRlZDwvbGk+Ci08L29sPgotPGgzPlRlc3QgU3RlcHM6PC9oMz48b2w+Ci08bGk+U3RhcnQgd2l6YXJkPC9saT4KLTxsaT5DaGVjayBwcm9qZWN0MSwgcHJvamVjdDIgYW5kIHByb2plY3QzPC9saT4KLTxsaT5NYWtlIHN1cmUgICJSZWxlYXNlIG9ubHkgdGhlIGNoYW5nZWQgcHJvamVjdHMiIHVuY2hlY2tlZDwvbGk+Ci08bGk+Q2xpY2sgbmV4dDwvbGk+Ci08bGk+QW5zd2VyIHllcyB0byBwcm9qZWN0MTwvbGk+Ci08bGk+QW5zd2VyIG5vIHRvIHByb2plY3QyPC9saT4KLTxsaT5FbnRlciB0YWcgInY1IjwvbGk+Ci08bGk+TWFrZSBzdXJlICAiTW92ZSB0YWcgaWYgaXQgYWxyZWFkeSBleGlzdHMiIHVuY2hlY2tlZDwvbGk+Ci08bGk+TWFrZSBzdXJlICAiVmFsaWRhdGUgcmVsZWFzZSIgY2hlY2tlZDwvbGk+Ci08bGk+TWFrZSBzdXJlICJTaG93IG1lIHRoZSBwcm9wb3NlZCBjaGFuZ2UgdGhlbiBjb21taXQgbWFwIGZpbGUiPC9saT4KLTxsaT5DbGljayBuZXh0PC9saT4KLTxsaT5DbGljayBuZXh0PC9saT4KLTxsaT5Db21tZW50IGFzICJhbGwgaGF2ZSBvdXRnb2luZyBjaGFuZ2Ugl3JlbGVhc2Ugc29tZSIgPC9saT4KLTxsaT5DbGljayBmaW5pc2g8L2xpPgotPGxpPkNsaWNrIG9rPC9saT4KLTwvb2w+Ci08aDM+RXhwZWN0ZWQgUmVzdWx0czo8L2gzPjxvbD4KLTxsaT5TdGVwIDQ6ICBNZXNzYWdlIGRpYWxvZyBhcHBlYXIgPC9saT4KLTxsaT5TdGVwNjogRW50ZXIgVGFnIHBhZ2Ugc2hvd3MgdXA8L2xpPgotPGxpPlN0ZXAgMTE6IENvbXBhcmUgVGFnIEZpbGVzIHBhZ2Ugc2hvd3MgdGhhdCBtYXAxLm1hcCBhbmQgbWFwMi5tYXAgaGF2ZSBwcm9wb3NlZCBjaGFuZ2VzPC9saT4KLTxsaT5TdGVwIDE0OiBWYWxpZGF0aW9uIGRpYWxvZyBzaG93cyB0aGF0IHByb2plY3QxIGhhcyBjaGFuZ2VzIGJldHdlZW4gbG9jYWwgYW5kIG5ldyByZWxlYXNlZCB2ZXJzaW9uPC9saT4KLTxsaT5TdGVwIDE2OiBXaXphcmQgZmluaXNoZXMuIEFuZCAgKGEpIHByb2plY3QxIGFuZCBwcm9qZWN0MyBhcmUgdGFnZ2VkIGFzIHY1IGluIGxvY2FsIG1hcCBmaWxlcywgcHJvamVjdDIgaXMgc3RpbGwgdGFnZ2VkIGFzIHY0OyAoYikgbWFwIHByb2plY3QgaXMgY29tbWl0dGVkOyAoYykgTm8gZGlmZmVyZW5jZSB3aWxsIGJlIGZvdW5kIGJ5IGNvbXBhcmluZyBsb2NhbCBhbmQgcmVwb3NpdG9yeSBtYXAgcHJvamVjdDsgKGQpIFByb2plY3QxaGFzIGRpZmZlcmVuY2VzIHdoZW4gY29tcGFyaW5nIGxvY2FsIGFuZCB2NSBpbiByZXBvc2l0b3J5IHZlcnNpb248L2xpPgotPC9vbD4KLQotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAyNC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAyNC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGZmNzg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMjQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5BYm91dCBDb25maWd1cmF0aW9uIFZhcmlhdGlvbnM8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPkFib3V0IENvbmZpZ3VyYXRpb24gVmFyaWF0aW9uczwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotVGhpcyBzZWN0aW9uIHdpbGwgY2FwdHVyZSBzb21lIHZhcmlhdGlvbnMgYmFzZWQgb24gdGhlIGRlZmF1bHQgY2FzZS4gVGhyZWUgdGVzdCBjYXNlcyBhcmUgcHJvdmlkZWQuIEFuZCB0aGV5IHdpbGwgY292ZXJzIAotPG9sPgotPGxpPiJSZWxlYXNlIG9ubHkgdGhlIGNoYW5nZWQgcHJvamVjdHMgc2luY2UgbGFzdCByZWxlYXNlIiBvcHRpb24gaXMgY2hlY2tlZCBvbiBwcm9qZWN0IHNlbGVjdGlvbiBwYWdlPC9saT4KLTxsaT4iTW92ZSB0YWcgaWYgZXhpc3RzIiBjaGVja2VkIG9uIGVudGVyIHRhZyBwYWdlPC9saT4KLTxsaT4iTW92ZSB0YWcgaWYgZXhpc3RzIiB1bmNoZWNrZWQ8L2xpPgotPC9vbD4KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMjUuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMjUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhZmYyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDI1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+QWxsIFByb2plY3RzIEhhdmUgQ2hhbmdlcyBTaW5jZSBMYXN0IFJlbGVhc2UgPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5BbGwgUHJvamVjdHMgSGF2ZSBDaGFuZ2VzIFNpbmNlIExhc3QgUmVsZWFzZSA8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLTxoMz5QcmVjb25kaXRpb246PC9oMz4KLTxvbD4KLTxsaT5Qcm9qZWN0MSwgcHJvamVjdDIgYW5kIHByb2plY3QzIHdlcmUgcmVsZWFzZWQgd2l0aCB0YWcgIlY1IjwvbGk+Ci08bGk+UHJvamVjdDEsIHByb2plY3QyIGFuZCBwcm9qZWN0MyB3ZXJlIG1vZGlmaWVkIGFuZCBjb21taXR0ZWQgYWZ0ZXIgVjUgcmVsZWFzZTwvbGk+Ci08bGk+UHJvamVjdDEsIHByb2plY3QyIGFuZCBwcm9qZWN0MyBoYXZlIG5vIG91dGdvaW5nIGNoYW5nZXM8L2xpPgotPGxpPk1hcCBwcm9qZWN0IGlzIGNvbW1pdHRlZDwvbGk+Ci08L29sPgotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLTxsaT5TdGFydCB3aXphcmQ8L2xpPgotPGxpPkNoZWNrZWQgdGhlIHRocmVlIHByb2plY3RzIGZyb20gcmVsZWFzZSB3aXphcmQ8L2xpPgotPGxpPkNoZWNrICJSZWxlYXNlIG9ubHkgdGhlIGNoYW5nZWQgcHJvamVjdHMiPC9saT4KLTxsaT5DbGljayBuZXh0PC9saT4KLTxsaT5DbGljayBuZXh0PC9saT4KLTxsaT5FbnRlciB0YWcgInY2IjwvbGk+Ci08bGk+TWFrZSBzdXJlICAiTW92ZSB0YWcgaWYgaXQgYWxyZWFkeSBleGlzdHMiIHVuY2hlY2tlZDwvbGk+Ci08bGk+TWFrZSBzdXJlICAiVmFsaWRhdGUgY2hhbmdlIGFmdGVyIHJlbGVhc2UiIGNoZWNrZWQ8L2xpPgotPGxpPk1ha2Ugc3VyZSAiU2hvdyBtZSB0aGUgcHJvcG9zZWQgY2hhbmdlIHRoZW4gY29tbWl0IG1hcCBmaWxlIjwvbGk+Ci08bGk+Q2xpY2sgbmV4dDwvbGk+Ci08bGk+Q2xpY2sgbmV4dDwvbGk+Ci08bGk+Q29tbWVudCBhcyAicmVsZWFzZSB1bmNoYW5nZWQgcHJvamVjdHOXcmVsZWFzZSBhbGwiIDwvbGk+Ci08bGk+Q2xpY2sgZmluaXNoPC9saT4KLTwvb2w+Ci08aDM+RXhwZWN0ZWQgUmVzdWx0czo8L2gzPgotPG9sPgotPGxpPlN0ZXAgNDogUHJvamVjdCBDb21wYXJlIGRpYWxvZyBzaG93cyBwcm9qZWN0MSwgcHJvamVjdDIgYW5kIHByb2plY3QzIGFsbCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IHJlbGVhc2UKLTxsaT5TdGVwIDU6ICBFbnRlciBUYWcgcGFnZSBzaG93cyB1cAotPGxpPlN0ZXAgMTA6ICBDb21wYXJlIE1hcCBGaWxlcyBwYWdlIHNob3dzIG1hcDEubWFwIGFuZCBtYXAyLm1hcCBoYXZlIHByb3Bvc2VkIGNoYW5nZXMuIERvdWJsZSBjbGljayBtYXAxLm1hcCwgeW91IHdpbGwgZmluZCB0aGUgdGFnIG9mIHByb2plY3QxIGFuZCBwcm9qZWN0MiBpcyB2NSBhbmQgdGhlIHRhZyBpcyBwcm9wb3NlZCB0byBiZWNvbWUgdjYuIERvdWJsZSBjbGljayBtYXAyLm1hcCwgeW91IHdpbGwgc2VlIHRoZSB0YWcgb2YgcHJvamVjdDMgaXMgYWxzbyBwcm9wb3NlZCB0byBiZWNvbWUgdjYgZnJvbSB2NS4KLTxsaT5TdGVwIDExOiAgQ29tbWl0IENvbW1lbnQgcGFnZSBzaG93cyB1cC4KLTxsaT5TdGVwIDEzOiBXaXphcmQgZmluaXNoZXMuIEFuZCAgKGEpIHByb2plY3QxLCBwcm9qZWN0MiBhbmQgcHJvamVjdDMgYXJlIHRhZ2dlZCBhcyB2NiBpbiBsb2NhbCBtYXAgZmlsZXM7IChiKSBtYXAgcHJvamVjdCBpcyBjb21taXR0ZWQ7IChjKSBObyBkaWZmZXJlbmNlIHdpbGwgYmUgZm91bmQgYnkgY29tcGFyaW5nIGxvY2FsIGFuZCByZXBvc2l0b3J5IG1hcCBwcm9qZWN0OyAoZCkgQ29tcGFyZSBsb2NhbCBhbmQgdjYgaW4gcmVwb3NpdG9yeSB2ZXJzaW9uLCB0aGVyZSBzaG91bGQgYmUgbm8gZGlmZmVyZW5jZSBmb3IgYWxsIDMgcHJvamVjdHMKLTwvb2w+Ci0KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMjYuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMjYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyNDc1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDI2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+U29tZSBQcm9qZWN0cyBIYXZlIENoYW5nZXMgU2luY2UgTGFzdCBSZWxlYXNlIDwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+U29tZSBQcm9qZWN0cyBIYXZlIENoYW5nZXMgU2luY2UgTGFzdCBSZWxlYXNlIDwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotPGgzPlByZWNvbmRpdGlvbjo8L2gzPgotPG9sPgotCTxsaT5Qcm9qZWN0MSwgcHJvamVjdDIgYW5kIHByb2plY3QzIHdlcmUgcmVsZWFzZWQgd2l0aCB0YWcgIlY2IjwvbGk+Ci0JPGxpPlByb2plY3QxIGFuZCBwcm9qZWN0MiB3ZXJlIG1vZGlmaWVkIGFmdGVyIFY2IHJlbGVhc2U8L2xpPgotCTxsaT5Qcm9qZWN0MSBhbmQgcHJvamVjdDIgd2VyZSBjb21taXR0ZWQgYW5kIG5vIG91dGdvaW5nIGNoYW5nZXM8L2xpPgotCTxsaT5Qcm9qZWN0MyBoYXMgbm8gY2hhbmdlIHNpbmNlIHJlbGVhc2UgdjY8L2xpPgotCTxsaT5NYXAgcHJvamVjdCBpcyBjb21taXR0ZWQ8L2xpPgotPC9vbD4KLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPlN0YXJ0IHdpemFyZDwvbGk+Ci0JPGxpPkNoZWNrZWQgdGhlIHRocmVlIHByb2plY3RzIGZyb20gcmVsZWFzZSB3aXphcmQ8L2xpPgotCTxsaT5DaGVjayAiVGFnIGFuZCByZWxlYXNlIG9ubHkgdGhlIGNoYW5nZWQgcHJvamVjdHMiPC9saT4KLQk8bGk+Q2xpY2sgbmV4dDwvbGk+Ci0JPGxpPkNsaWNrIG5leHQ8L2xpPgotCTxsaT5FbnRlciB0YWcgInY3IjwvbGk+Ci0JPGxpPk1ha2Ugc3VyZSAgIk1vdmUgdGFnIGlmIGl0IGFscmVhZHkgZXhpc3RzIiB1bmNoZWNrZWQ8L2xpPgotCTxsaT5NYWtlIHN1cmUgICJWYWxpZGF0ZSBjaGFuZ2UgYWZ0ZXIgcmVsZWFzZSIgY2hlY2tlZDwvbGk+Ci0JPGxpPk1ha2Ugc3VyZSAiU2hvdyBtZSB0aGUgcHJvcG9zZWQgY2hhbmdlIHRoZW4gY29tbWl0IG1hcCBmaWxlIjwvbGk+Ci0JPGxpPkNsaWNrIG5leHQ8L2xpPgotCTxsaT5DbGljayBuZXh0PC9saT4KLQk8bGk+Q29tbWVudCBhcyAicmVsZWFzZSB1bmNoYW5nZWQgcHJvamVjdHOXcmVsZWFzZSBhbGwiIDwvbGk+Ci0JPGxpPkNsaWNrIGZpbmlzaDwvbGk+Ci08L29sPgotPGgzPkV4cGVjdGVkIFJlc3VsdHM6PC9oMz4KLTxvbD4KLQk8bGk+U3RlcCA0OiBQcm9qZWN0IENvbXBhcmUgZGlhbG9nIHNob3dzIHByb2plY3QxLCBwcm9qZWN0MiBidXQgbm90IHByb2plY3QgMwotCTxsaT5TdGVwIDU6ICBFbnRlciBUYWcgcGFnZSBzaG93cyB1cAotCTxsaT5TdGVwIDEwOiAgQ29tcGFyZSBNYXAgRmlsZXMgcGFnZSBzaG93cyBtYXAxLm1hcCBoYXMgcHJvcG9zZWQgY2hhbmdlcy4gRG91YmxlIGNsaWNrIG1hcDEubWFwLCB5b3Ugd2lsbCBmaW5kIHRoZSB0YWcgb2YgcHJvamVjdDEgYW5kIHByb2plY3QyIGlzIHY3IGFuZCB0aGUgdGFnIGlzIHByb3Bvc2VkIHRvIGJlY29tZSB2Ni4gCi0JPGxpPlN0ZXAgMTE6ICBDb21taXQgQ29tbWVudCBwYWdlIHNob3dzIHVwLgotCTxsaT5TdGVwIDEzOiBXaXphcmQgZmluaXNoZXMuIEFuZCAgKGEpIHByb2plY3QxLCBwcm9qZWN0MiBhcmUgdGFnZ2VkIGFzIHY3IGluIGxvY2FsIG1hcCBmaWxlczsgcHJvamVjdDMgaXMgc3RpbGwgdjY7IChiKSBtYXAgcHJvamVjdCBpcyBjb21taXR0ZWQ7IChjKSBObyBkaWZmZXJlbmNlIHdpbGwgYmUgZm91bmQgYnkgY29tcGFyaW5nIGxvY2FsIGFuZCByZXBvc2l0b3J5IG1hcCBwcm9qZWN0OyAoZCkgQ29tcGFyZSBsb2NhbCBhbmQgdjcgaW4gcmVwb3NpdG9yeSB2ZXJzaW9uLCB0aGVyZSBzaG91bGQgYmUgbm8gZGlmZmVyZW5jZSBmb3IgcHJvamVjdDEgYW5kIHByb2plY3QyCi08L29sPgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAyNy5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAyNy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTJmMTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMjcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5Nb3ZlIFRhZyBPcHRpb24gRGVzZWxlY3RlZCAvIFNlbGVjdGVkPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5Nb3ZlIFRhZyBPcHRpb24gRGVzZWxlY3RlZCAvIFNlbGVjdGVkPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotCi08aDM+UHJlY29uZGl0aW9uOjwvaDM+Ci08b2w+Ci0JPGxpPlByb2plY3QxLCBwcm9qZWN0MiBhbmQgcHJvamVjdDMgd2VyZSByZWxlYXNlZCB3aXRoIHRhZyAidjciPC9saT4KLQk8bGk+UHJvamVjdDEgaXMgbW9kaWZpZWQgYW5kIGNvbW1pdHRlZCBhZnRlciBiZWVuIHRhZ2dlZCBhcyB2NzwvbGk+Ci0JPGxpPlByb2plY3QyIGFuZCBwcm9qZWN0MyBoYXZlIG5vIGFueSBjaGFuZ2Ugc2luY2UgYmVlbiB0YWdnZWQgYXMgdjc8L2xpPgotPC9vbD4KLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPlN0YXJ0IHdpemFyZDwvbGk+Ci0JPGxpPkNoZWNrZWQgdGhlIHRocmVlIHByb2plY3RzIGZyb20gcmVsZWFzZSB3aXphcmQ8L2xpPgotCTxsaT5VbmNoZWNrICJSZWxlYXNlIG9ubHkgdGhlIGNoYW5nZWQgcHJvamVjdHMiPC9saT4KLQk8bGk+Q2xpY2sgbmV4dDwvbGk+Ci0JPGxpPkVudGVyIHRhZyAidjciPC9saT4KLQk8bGk+TWFrZSBzdXJlICAiTW92ZSB0YWcgaWYgaXQgYWxyZWFkeSBleGlzdHMiIHVuY2hlY2tlZDwvbGk+Ci0JPGxpPk1ha2Ugc3VyZSAgIlZhbGlkYXRlIGNoYW5nZSBhZnRlciByZWxlYXNlIiBjaGVja2VkPC9saT4KLQk8bGk+TWFrZSBzdXJlICJTaG93IG1lIHRoZSBwcm9wb3NlZCBjaGFuZ2UgdGhlbiBjb21taXQgbWFwIGZpbGUiPC9saT4KLQk8bGk+Q2xpY2sgbmV4dDwvbGk+Ci0JPGxpPkNsaWNrIG5leHQ8L2xpPgotCTxsaT5Db21tZW50IGFzICJyZWxlYXNlIHByb2plY3Rzl21vdmUgdGFnIiA8L2xpPgotCTxsaT5DbGljayBmaW5pc2g8L2xpPgotCTxsaT5DbGljayBiYWNrPC9saT4KLQk8bGk+Q2hlY2sgIk1vdmUgdGFnIGlmIGl0IGFscmVhZHkgZXhpc3RzJzwvbGk+Ci0JPGxpPkNsaWNrIGZpbmlzaDwvbGk+Ci08L29sPgotPGgzPkV4cGVjdGVkIFJlc3VsdHM6PC9oMz4KLTxvbD4KLQk8bGk+U3RlcDQ6IEVudGVyIFRhZyBwYWdlIGFwcGVhcnM7PC9saT4KLQk8bGk+U3RlcDk6IENvbXBhcmUgTWFwIEZpbGVzIHBhZ2Ugbm8gbWFwICBmaWxlIHdpdGggZGlmZmVyZW5jZTwvbGk+Ci0JPGxpPlN0ZXAxMDogQ29tbWl0IENvbW1lbnQgcGFnZSBzaG93cyB1cDwvbGk+Ci0JPGxpPlN0ZXAxMjogRXJyb3IgbWVzc2FnZSBzaG93cyAyIHByb2plY3RzIHN1Y2Nlc3NmdWxseSB0YWdnZWQgYW5kIDEgZmFpbHMgPC9saT4KLQk8bGk+U3RlcCAxMzogR28gYmFjayB0byB0YWcgcGFnZTwvbGk+Ci0JPGxpPlJlbGVhc2Ugc3VjY2Vzc2Z1bGx5PC9saT4KLTwvb2w+Ci0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDI4Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDI4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNWFkMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAyOC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPlJlbGVhc2UgV2l6YXJkPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5SZWxlYXNlIFdpemFyZDwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotQW5zd2VyIGNvbWVzIGhlcmUuCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDI5Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDI5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OGIyYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAyOS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPkE8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPkE8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLUFuc3dlciBjb21lcyBoZXJlLgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAzMC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAzMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjRmMTM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMzAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5Db21wYXJlIFdpdGggUmVsZWFzZWQ8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPkNvbXBhcmUgV2l0aCBSZWxlYXNlZDwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotQW5zd2VyIGNvbWVzIGhlcmUuCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDMxLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDMxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTE5NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAzMS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPlJlcGxhY2UgV2l0aCBSZWxlYXNlZDwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+UmVwbGFjZSBXaXRoIFJlbGVhc2VkPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotCi1BbnN3ZXIgY29tZXMgaGVyZS4KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMzIuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMzIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwNjAwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDMyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+T25lIFByb2plY3QgV2l0aG91dCBDaGFuZ2U8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPk9uZSBQcm9qZWN0IFdpdGhvdXQgQ2hhbmdlPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+Q29tbWl0IGEgcHJvamVjdDwvbGk+Ci0JPGxpPlJlbGVhc2UgdGhlIHByb2plY3Q8L2xpPgotCTxsaT5NYWtlIHN1cmUgbWFwIGZpbGUgaXMgdXBkYXRlZCBhbmQgY29tbWl0dGVkCi0JPGxpPlJpZ2h0IGNsaWNrIHRoZSBwcm9qZWN0PC9saT4KLQk8bGk+Q2xpY2sgQ29tcGFyZSBXaXRoLT5SZWxlYXNlZDwvbGk+Ci08L29sPgotCi08aDM+RXhwZWN0ZWQgUmVzdWx0czo8L2gzPgotVGVhbSBSZWZyZXNoIENvbXBsZXRlIGRpYWxvZyB3aWxsIHNob3cgdGhlcmUgaXMgbm8gY2hhbmdlIGZvciB0aGlzIHByb2plY3QKLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDMzLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDMzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjE1MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAzMy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk9uZSBQcm9qZWN0IFdpdGggQ2hhbmdlczwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+T25lIFByb2plY3QgV2l0aCBDaGFuZ2VzPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+Q3JlYXRlIGEgcHJvamVjdDwvbGk+Ci0JPGxpPkFkZCBhIGZpbGUgdG8gdGhlIHByb2plY3Q8L2xpPgotCTxsaT5Db21taXQgYSBwcm9qZWN0PC9saT4KLQk8bGk+QWRkIGEgbWFwIGVudHJ5IGluIGEgbWFwIGZpbGUgZm9yIHRoZSBwcm9qZWN0PC9saT4KLQk8bGk+UmVsZWFzZSB0aGUgcHJvamVjdDwvbGk+Ci0JPGxpPk1ha2Ugc3VyZSBtYXAgZmlsZSBpcyB1cGRhdGVkIGFuZCBjb21taXR0ZWQKLQk8bGk+UmlnaHQgY2xpY2sgdGhlIHByb2plY3Q8L2xpPgotCTxsaT5DbGljayBDb21wYXJlIFdpdGgtPlJlbGVhc2VkPC9saT4KLQk8bGk+RW5zdXJlIHRoZXJlIGlzbm8gY2hhbmdlPC9saT4KLQk8bGk+RWRpdCB0aGUgZmlsZSBpbiB0aGUgcHJvamVjdCBhbmQgc2F2ZSB0aGUgY2hhbmdlPC9saT4KLQk8bGk+QWRkIGEgbmV3IGZpbGUgdG8gdGhlIHByb2plY3Q8L2xpPgotCTxsaT5BZGQgYSBuZXcgZm9sZGVyIHRvIHRoZSBwcm9qZWN0PC9saT4KLQk8bGk+T3B0aW9uYWxseSBjb21taXQgdGhlIGNoYW5nZXM8L2xpPgotCTxsaT5SaWdodCBjbGljayB0aGUgcHJvamVjdDwvbGk+Ci0JPGxpPkNsaWNrIENvbXBhcmUgV2l0aC0+UmVsZWFzZWQ8L2xpPgotCTxsaT5FbnN1cmUgdGhlcmUgYXJlIDMgY2hhbmdlczwvbGk+Ci0JPGxpPlJlbGVhc2UgdGhlIHByb2plY3QgYWdhaW48L2xpPgotCTxsaT5EZWxldGUgYSBmaWxlPC9saT4KLQk8bGk+RGVsZXRlIHRoZSBmb2xkZXI8L2xpPgotCTxsaT5PcHRpb25hbGx5IGNvbW1pdCB0aGUgY2hhbmdlczwvbGk+Ci0JPGxpPlJpZ2h0IGNsaWNrIHRoZSBwcm9qZWN0PC9saT4KLQk8bGk+Q2xpY2sgQ29tcGFyZSBXaXRoLT5SZWxlYXNlZDwvbGk+Ci0JPGxpPkVuc3VyZSB0aGVyZSBhcmUgdHdvIGNoYWduZXM8L2xpPgotPC9vbD4KLTxoMz5CdWcgRm91bmQ8L2gzPgotVGhlIG5ldyBhZGRlZCBlbXB0eSBmb2xkZXIgaXMgbm90IGZvdW5kIGJ5IHRoZSBjb21wYXJlLiAKLU5vdGUgdGhhdCB0aGUgY2hhbmdlIHdpbGwgYmUgZm91bmQgaWYgdGhlIG5ldyBhZGRlZCBmb2xkZXIgaXMgbm90IGVtcHR5LgotQWxzbyBub3RpY2VkIHRoYXQgSSB0cmllZCB0byBjb21taXQgdGhlIGNoYW5nZSBhZnRlciBhIG5ldyBlbXB0eSBmb2xkZXIgd2FzCi1hZGRlZCwgYnV0IHRoZSBjb21taXQgZmFpbGVkIHRvIGNoZWNrIGluIHRoaXMgZm9sZGVyLiBCZWNhdXNlIG9mIHRoaXMgYWJvdmUsCi1kZWxldGVpb24gb2YgYSByZWxlYXNlZCBlbXB0eSBmb2xkZXIgY2FuIG5vdCBiZSB0ZXN0ZWQgc28gZmFyLgotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMzQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMzQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkMzBkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDM0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+T25lIFByb2plY3QgV2l0aCBPdXRnb2luZyBBZGRpdGlvbjwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+T25lIFByb2plY3QgV2l0aCBPdXRnb2luZyBBZGRpdGlvbjwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+Q29tbWl0IGEgcHJvamVjdDwvbGk+Ci0JPGxpPlJlbGVhc2UgdGhlIHByb2plY3Q8L2xpPgotCTxsaT5NYWtlIHN1cmUgbWFwIGZpbGUgaXMgdXBkYXRlZCBhbmQgY29tbWl0dGVkCi0JPGxpPkFkZCBhIGZpbGUgdG8gdGhlIHByb2plY3QKLQk8bGk+UmlnaHQgY2xpY2sgdGhlIHByb2plY3Q8L2xpPgotCTxsaT5DbGljayBDb21wYXJlIFdpdGgtPlJlbGVhc2VkPC9saT4KLTwvb2w+Ci0KLTxoMz5FeHBlY3RlZCBSZXN1bHRzOjwvaDM+Ci1UZWFtIFJlZnJlc2ggQ29tcGxldGUgZGlhbG9nIHdpbGwgc2hvdyB0aGVyZSBpcyBhIG5ldyBjaGFuZ2UgZm9yIHRoaXMgcHJvamVjdAotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAzNS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAzNS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWRhMjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMzUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NdWx0aXBsZSBQcm9qZWN0cyBXaXRob3V0IENoYW5nZTwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+TXVsdGlwbGUgUHJvamVjdHMgV2l0aG91dCBDaGFuZ2U8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci08aDM+VGVzdCBTdGVwczo8L2gzPgotPG9sPgotCTxsaT5Db21taXQgdHdvIHByb2plY3Q8L2xpPgotCTxsaT5SZWxlYXNlIHRoZSB0d28gcHJvamVjdHM8L2xpPgotCTxsaT5NYWtlIHN1cmUgbWFwIGZpbGUgaXMgdXBkYXRlZCBhbmQgY29tbWl0dGVkCi0JPGxpPlNlbGVjdGVkIHRoZSB0d28gcHJvamVjdHM8L2xpPgotCTxsaT5DbGljayBDb21wYXJlIFdpdGgtPlJlbGVhc2VkPC9saT4KLTwvb2w+Ci0KLTxoMz5FeHBlY3RlZCBSZXN1bHRzOjwvaDM+Ci1UZWFtIFJlZnJlc2ggQ29tcGxldGUgZGlhbG9nIHdpbGwgc2hvdyB0aGVyZSBpcyBubyBjaGFuZ2UgZm9yIHRoZSB0d28gcHJvamVjdHMKLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMzYuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMzYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkNDQyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDM2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TXVsdGlwbGUgUHJvamVjdHMgV2l0aCBPdXRnb2luZyBDaGFuZ2VzPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5NdWx0aXBsZSBQcm9qZWN0cyBXaXRoIE91dGdvaW5nIENoYW5nZXM8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci08aDM+VGVzdCBTdGVwczo8L2gzPgotPG9sPgotCTxsaT5BZGQgb25lIGZpbGUgdG8gZWFjaCBvZiB0d28gcHJvamVjdHM8L2xpPgotCTxsaT5Db21taXQgdGhlc2UgdHdvIHByb2plY3Q8L2xpPgotCTxsaT5SZWxlYXNlIHRoZSB0d28gcHJvamVjdHM8L2xpPgotCTxsaT5NYWtlIHN1cmUgbWFwIGZpbGUgaXMgdXBkYXRlZCBhbmQgY29tbWl0dGVkPC9saT4KLQk8bGk+U2VsZWN0ZWQgdGhlIHR3byBwcm9qZWN0czwvbGk+Ci0JPGxpPkNsaWNrIENvbXBhcmUgV2l0aC0+UmVsZWFzZWQ8L2xpPgotCTxsaT5FbnN1cmUgdGhlcmUgaXMgbm8gY2hhbmdlPC9saT4KLQk8bGk+RWRpdCB0aGUgdHdvIGZpbGVzIGFuZCBzYXZlPC9saT4KLQk8bGk+QWRkIGEgZmlsZSB0byAxc3QgcHJvamVjdDwvbGk+Ci0JPGxpPkFkZCBhIGZvbGRlciB0byAybmQgcHJvamVjdDwvbGk+Ci0JPGxpPkFkZCBhIGZpbGUgdG8gdGhlIGZvbGRlcjwvbGk+Ci0JPGxpPk9wdGlvbmFsbHksIGNvbW1pdCB0aGUgdHdvIHByb2plY3RzCi0JPGxpPlNlbGVjdGVkIHRoZSB0d28gcHJvamVjdHM8L2xpPgotCTxsaT5DbGljayBDb21wYXJlIFdpdGgtPlJlbGVhc2VkPC9saT4KLQk8bGk+RW5zdXJlIHRoZXJlIGFyZSB0d28gY2hhbmdzIGZvciBlYWNoIG9mIHRoZSBwcm9qZWN0czwvbGk+Ci08L29sPgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAzNy5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAzNy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjQwOTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMzcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5Db21wYXJlIGEgRmlsZTwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+Q29tcGFyZSBhIEZpbGU8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci08aDM+VGVzdCBTdGVwczo8L2gzPgotPG9sPgotCTxsaT5TZWxlY3Qgb25lIHJlbGVhc2VkIHByb2plY3Q8L2xpPgotCTxsaT5SaWdodCBjbGljayBvbmUgb2YgaXRzIGZpbGU8L2xpPgotCTxsaT5DbGljayBDb21wYXJlIFdpdGg8L2xpPgotCTxsaT5FbnN1cmUgdGhlcmUgaXMgbm8gY2hhbmdlPC9saT4KLQk8bGk+RWRpdCB0aGUgZmlsZSBhbmQgc2F2ZTwvbGk+Ci0JPGxpPlJpZ2h0IGNsaWNrIGFuZCBjb21wYXJlIHRoZSBmaWxlIGFnYWluPC9saT4KLQk8bGk+RW5zdXJlIHRoZXJlIGlzIGEgY2hhbmdlPC9saT4KLTwvb2w+Ci0KLTxoMz5CdWcgRm91bmQ6PC9oMz4KLVJlbGVhc2VkIG1lbnUgYmFyIGlzIGRpc2FibGVkIGFuZCBjYW5ub3QgcGVyZm9ybSBjb21wYXJlIHdpdGggcmVsZWFzZWQKLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMzguaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwMzguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiMjdjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDM4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+Q29tcGFyZSBBIEZvbGRlcjwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+Q29tcGFyZSBBIEZvbGRlcjwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+U2VsZWN0IG9uZSByZWxlYXNlZCBwcm9qZWN0PC9saT4KLQk8bGk+UmlnaHQgY2xpY2sgb25lIG9mIGl0cyBmb2xkZXI8L2xpPgotCTxsaT5DbGljayBDb21wYXJlIFdpdGg8L2xpPgotCTxsaT5FbnN1cmUgdGhlcmUgaXMgbm8gY2hhbmdlPC9saT4KLQk8bGk+QWRkIGEgZmlsZSB0byB0aGUgZm9sZGVyPC9saT4KLQk8bGk+UmlnaHQgY2xpY2sgYW5kIGNvbXBhcmUgdGhlIGZvbGRlciBhZ2FpbjwvbGk+Ci0JPGxpPkVuc3VyZSB0aGVyZSBpcyBhIGNoYW5nZTwvbGk+Ci08L29sPgotCi08aDM+QnVnIEZvdW5kOjwvaDM+Ci1SZWxlYXNlZCBtZW51IGJhciBpcyBkaXNhYmxlZCBhbmQgY2Fubm90IHBlcmZvcm0gY29tcGFyZSB3aXRoIHJlbGVhc2VkCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDM5Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDM5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYTcwNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDAzOS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk9uZSBwcm9qZWN0IFdpdGggT3V0Z29pbmcgQ2hhbmdlPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5PbmUgcHJvamVjdCBXaXRoIE91dGdvaW5nIENoYW5nZTwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+Q29tbWl0IGEgcHJvamVjdDwvbGk+Ci0JPGxpPlJlbGVhc2UgdGhlIHByb2plY3Q8L2xpPgotCTxsaT5NYWtlIHN1cmUgbWFwIGZpbGUgaXMgdXBkYXRlZCBhbmQgY29tbWl0dGVkCi0JPGxpPkVpZHQgYSBmaWxlIGluIHRoZSBwcm9qZWN0IGFuZCBzYXZlIGl0PC9saT4KLQk8bGk+UmlnaHQgY2xpY2sgdGhlIHByb2plY3Q8L2xpPgotCTxsaT5DbGljayBSZXBsZWFjZSBXaXRoLT5SZWxlYXNlZDwvbGk+Ci08L29sPgotCi08aDM+RXhwZWN0ZWQgUmVzdWx0czo8L2gzPgotPG9sPgotPGxpPkNvbmZpcm0gT3ZlcndyaXRlIG1lc3NhZ2UgZGlhbG9nIHNob3dzIHVwPC9saT4KLTxsaT5Mb2NhbCBwcm9qZWN0IGlzIHJlcGxhY2VkIHdpdGggdGhlIHJlbGVhc2VkIG9uZSBpZiBhbnN3ZXIgIlllcyI8L2xpPgotPC9vbD4KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDQwLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDQwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOGQ5ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA0MC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk9uZSBQcm9qZWN0IFdpdGggT3V0Z29pbmcgRGVsZXRpb248L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPk9uZSBQcm9qZWN0IFdpdGggT3V0Z29pbmcgRGVsZXRpb248L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPkFkZCBhIGZpbGUgYSBwcm9qZWN0PC9saT4KLQk8bGk+Q29tbWl0IHRoZSBwcm9qZWN0PC9saT4KLQk8bGk+UmVsZWFzZSB0aGUgcHJvamVjdDwvbGk+Ci0JPGxpPk1ha2Ugc3VyZSBtYXAgZmlsZSBpcyB1cGRhdGVkIGFuZCBjb21taXR0ZWQKLQk8bGk+RGVsZXRlIHRoZSBmaWxlIGZyb20gdGhlIHByb2plY3QKLQk8bGk+UmlnaHQgY2xpY2sgdGhlIHByb2plY3Q8L2xpPgotCTxsaT5DbGljayBDb21wYXJlIFdpdGgtPlJlbGVhc2VkPC9saT4KLTwvb2w+Ci0KLTxoMz5FeHBlY3RlZCBSZXN1bHRzOjwvaDM+Ci1UZWFtIFJlZnJlc2ggQ29tcGxldGUgZGlhbG9nIHdpbGwgc2hvdyB0aGVyZSBpcyBhIG5ldyBjaGFuZ2UgZm9yIHRoaXMgcHJvamVjdAotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA0MS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA0MS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjQ0ODAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNDEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5PbmUgUHJvamVjdCBXaXRoIE91dGdvaW5nIEFkZHRpb248L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPk9uZSBQcm9qZWN0IFdpdGggT3V0Z29pbmcgQWRkdGlvbjwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+Q29tbWl0IGEgcHJvamVjdDwvbGk+Ci0JPGxpPlJlbGVhc2UgdGhlIHByb2plY3Q8L2xpPgotCTxsaT5NYWtlIHN1cmUgbWFwIGZpbGUgaXMgdXBkYXRlZCBhbmQgY29tbWl0dGVkCi0JPGxpPkFkZCBhIGZpbGUgdG8gdGhlIHByb2plY3QKLQk8bGk+UmlnaHQgY2xpY2sgdGhlIHByb2plY3Q8L2xpPgotCTxsaT5DbGljayBSZXBsYWNlIFdpdGgtPlJlbGVhc2VkPC9saT4KLTwvb2w+Ci0KLTxoMz5FeHBlY3RlZCBSZXN1bHRzOjwvaDM+Ci08b2w+Ci08bGk+Q29uZmlybSBPdmVyd3JpdGUgbWVzc2FnZSBkaWFsb2cgc2hvd3MgdXA8L2xpPgotPGxpPkxvY2FsIHByb2plY3QgaXMgcmVwbGFjZWQgd2l0aCB0aGUgcmVsZWFzZWQgb25lIGlmIGFuc3dlciAiWWVzIjwvbGk+Ci08L29sPgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA0Mi5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA0Mi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTY0NjA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNDIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5PbmUgUHJvamVjdCBXaXRoIE91dGdvaW5nIERlbGV0aW9uPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5PbmUgUHJvamVjdCBXaXRoIE91dGdvaW5nIERlbGV0aW9uPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotCi08aDM+VGVzdCBTdGVwczo8L2gzPgotPG9sPgotCTxsaT5BZGQgYSBmaWxlIGEgcHJvamVjdDwvbGk+Ci0JPGxpPkNvbW1pdCB0aGUgcHJvamVjdDwvbGk+Ci0JPGxpPlJlbGVhc2UgdGhlIHByb2plY3Q8L2xpPgotCTxsaT5NYWtlIHN1cmUgbWFwIGZpbGUgaXMgdXBkYXRlZCBhbmQgY29tbWl0dGVkCi0JPGxpPkRlbGV0ZSB0aGUgZmlsZSBmcm9tIHRoZSBwcm9qZWN0Ci0JPGxpPlJpZ2h0IGNsaWNrIHRoZSBwcm9qZWN0PC9saT4KLQk8bGk+Q2xpY2sgUmVwbGFjZSBXaXRoLT5SZWxlYXNlZDwvbGk+Ci08L29sPgotCi08aDM+RXhwZWN0ZWQgUmVzdWx0czo8L2gzPgotPG9sPgotPGxpPkNvbmZpcm0gT3ZlcndyaXRlIG1lc3NhZ2UgZGlhbG9nIHNob3dzIHVwPC9saT4KLTxsaT5Mb2NhbCBwcm9qZWN0IGlzIHJlcGxhY2VkIHdpdGggdGhlIHJlbGVhc2VkIG9uZSBpZiBhbnN3ZXIgIlllcyI8L2xpPgotPC9vbD4KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDQzLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDQzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyM2Y0NGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA0My5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk9uZSBQcm9qZWN0IFdpdGhvdXQgQ2hhbmdlPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5PbmUgUHJvamVjdCBXaXRob3V0IENoYW5nZTwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPkNvbW1pdCBhIHByb2plY3Q8L2xpPgotCTxsaT5SZWxlYXNlIHRoZSBwcm9qZWN0PC9saT4KLQk8bGk+TWFrZSBzdXJlIG1hcCBmaWxlIGlzIHVwZGF0ZWQgYW5kIGNvbW1pdHRlZAotCTxsaT5SaWdodCBjbGljayB0aGUgcHJvamVjdDwvbGk+Ci0JPGxpPkNsaWNrIFJlcGxhY2UgV2l0aC0+UmVsZWFzZWQ8L2xpPgotPC9vbD4KLQotPGgzPkV4cGVjdGVkIFJlc3VsdHM6PC9oMz4KLU5vdGhpbmcgb2YgdGhlIHByb2plY3QgY2hhbmdlZCBsb2NhbGx5Ci0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDQ0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDQ0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MDMxYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA0NC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk11bHRpcGxlIFByb2plY3RzPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5NdWx0aXBsZSBQcm9qZWN0czwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPkNvbW1pdCBmb3VyIHByb2plY3RzPC9saT4KLQk8bGk+UmVsZWFzZSBhbGwgdGhlIHByb2plY3RzPC9saT4KLQk8bGk+TWFrZSBzdXJlIG1hcCBmaWxlIGlzIHVwZGF0ZWQgYW5kIGNvbW1pdHRlZDwvbGk+Ci0JPGxpPkVkaXR0aW5nIHRoZSBmaXJzdCBwcm9qZWN0IGFuZCBzYXZlPC9saT4KLQk8bGk+QWRkIGEgZmlsZSB0byB0aGUgMm5kIHByb2plY3Q8L2xpPgotCTxsaT5EZWxldGUgYSBmaWxlIGZyb20gdGhlIDNyZCBwcm9qZWN0PC9saT4KLQk8bGk+U2VsZWN0ZSB0aGUgZm91ciBwcm9qZWN0czwvbGk+Ci0JPGxpPkNsaWNrIFJlcGxhY2UgV2l0aC0+UmVsZWFzZWQ8L2xpPgotPC9vbD4KLQotPGgzPkV4cGVjdGVkIFJlc3VsdHM6PC9oMz4KLTxvbD4KLTxsaT5jb25maXJtIE92ZXJ3cml0ZSBkaWFsb2cgd2lsbCBzaG93IHVwPC9saT4KLTxsaT5UaGUgMXN0LCAybmQgYW5kIDNyZCBwcm9qZWN0cyBhcmUgcmVwbGFjZWQgaWYgYW5zd2VyICJZZXMiPC9saT4KLTxsaT5UaGUgNHRoIHByb2plY3QgaGFzIG5vdCBiZWVuIGNoYW5nZWQ8L2xpPgotPC9vbD4KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDQ1Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDQ1Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZjZlNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA0NS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPlJlcGxhY2UgQSBGaWxlPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5SZXBsYWNlIEEgRmlsZTwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPlNlbGVjdCBvbmUgcmVsZWFzZWQgcHJvamVjdDwvbGk+Ci0JPGxpPkVkaXQgb25lIG9mIGl0cyBmaWxlIGFuZCBzYXZlPC9saT4KLQk8bGk+UmlnaHQgY2xpY2sgdGhlIGZpbGU8L2xpPgotCTxsaT5DbGljayBSZXBsYWNlIFdpdGg8L2xpPgotCTxsaT5FbnN1cmUgcmVwbGFjZWQ8L2xpPgotPC9vbD4KLQotPGgzPkJ1ZyBGb3VuZDo8L2gzPgotUmVsZWFzZWQgbWVudSBiYXIgaXMgZGlzYWJsZWQgYW5kIGNhbm5vdCBwZXJmb3JtIHJlcGxhY2Ugd2l0aCByZWxlYXNlZAotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA0Ni5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA0Ni5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTU5OTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNDYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5SZXBsYWNlIEEgRm9sZGVyPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5SZXBsYWNlIEEgRm9sZGVyPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+U2VsZWN0IG9uZSByZWxlYXNlZCBwcm9qZWN0PC9saT4KLQk8bGk+QWRkIGEgZmlsZSB0byBvbmUgb2YgaXRzIGZvbGRlcjwvbGk+Ci0JPGxpPlJpZ2h0IGNsaWNrIHRoZSBmb2xkZXI8L2xpPgotCTxsaT5DbGljayBSZXBsYWNlIFdpdGg8L2xpPgotCTxsaT5FbnN1cmUgdGhlIGZvbGRlciBpcyByZXBsYWNlZDwvbGk+Ci08L29sPgotCi08aDM+QnVnIEZvdW5kOjwvaDM+Ci1SZWxlYXNlZCBtZW51IGJhciBpcyBkaXNhYmxlZCBhbmQgY2Fubm90IHBlcmZvcm0gcmVwbGFjZSB3aXRoIHJlbGVhc2VkCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDQ3Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDQ3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTMyOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA0Ny5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPkxvYWQgTWFwIFByb2plY3RzPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5Mb2FkIE1hcCBQcm9qZWN0czwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotQW5zd2VyIGNvbWVzIGhlcmUuCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDQ4Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDQ4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZThhNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA0OC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPkxvY2FsIEhhcyBUaGUgTGF0ZXN0IE1hcDwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+TG9jYWwgSGFzIFRoZSBMYXRlc3QgTWFwPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotCi1BbnN3ZXIgY29tZXMgaGVyZS4KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNDkuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNDkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU1YTg3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDQ5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TG9jYWwgSGFzIEFuIE9sZCBNYXA8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPkxvY2FsIEhhcyBBbiBPbGQgTWFwPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotCi1BbnN3ZXIgY29tZXMgaGVyZS4KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNTAuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZiNDhhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDUwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+UHJvamVjdCBIYXMgQSBNb2R1bGUgTmFtZTwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+UHJvamVjdCBIYXMgQSBNb2R1bGUgTmFtZTwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotQW5zd2VyIGNvbWVzIGhlcmUuCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDUxLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDUxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYTIwMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA1MS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPjwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+PC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotCi1BbnN3ZXIgY29tZXMgaGVyZS4KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNTIuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNTIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmOTQ0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDUyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+UHJvamVjdCBFeGlzdCBMb2NhbGx5PC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5Qcm9qZWN0IEV4aXN0IExvY2FsbHk8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLUFuc3dlciBjb21lcyBoZXJlLgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA1My5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA1My5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjE3ZjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNTMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5Qcm9qZWN0IERvZXMgTm90IEV4aXN0IExvY2FsbHk8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPlByb2plY3QgRG9lcyBOb3QgRXhpc3QgTG9jYWxseTwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPlNlbGVjdCBvbmUgcmVsZWFzZWQgcHJvamVjdDwvbGk+Ci0JPGxpPk1ha2Ugc3VyZSB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgbWFwIGVudHJ5IGZvciB0aGlzIHByb2plY3Q8L2xpPgotCTxsaT5EZWxldGUgdGhlIHByb2plY3QgbG9jYWxseTwvbGk+Ci0JPGxpPlJpZ2h0IHRoZSBtYXAgZmlsZSBoYXZpbmcgdGhlIGVudHJ5PC9saT4KLQk8bGk+Q2xpY2sgVGVhbS0+TG9hZCBNYXAgUHJvamVjdHM8L2xpPgotPC9vbD4KLQotPGgzPkV4cGVjdGVkIFJlc3VsdHM6PC9oMz4KLTxvbD4KLTxsaT5UaGUgcHJvamVjdCBpcyBhZGRlZCB0byB0aGUgd29ya3NwYWNlPC9saT4KLTxsaT5BIHRhZyBuYW1lIGFwcGVhcnMgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHByb2plY3QgbmFtZTwvbGk+Ci08bGk+VGhlIHRhZyBpcyBzYW1lIGFzIHRoZSB0YWcgZm9yIHRoaXMgcHJvamVjdCBpbiB0aGUgbWFwIGZpbGU8L2xpPgotPC9vbD4KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNTQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNTQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiNmJlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDU0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TWFwIEZpbGUgQ29udGFpbnMgVW5leGlzdGluZyBQcm9qZWN0PC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5NYXAgRmlsZSBDb250YWlucyBVbmV4aXN0aW5nIFByb2plY3Q8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci08aDM+VGVzdCBTdGVwczo8L2gzPgotPG9sPgotCTxsaT5TZWxlY3QgYSBtYXAgZmlsZTwvbGk+Ci0JPGxpPkFkZCBhbiBlbnRyeSBsaW5lIHdoaWNoIHJlZmVycyB0byBhbiB1bmV4aXN0aW5nIHByb2plY3Q8L2xpPgotCTxsaT5TYXZlIHRoZSBtYXAgZmlsZTwvbGk+Ci0JPGxpPlJpZ2h0IGNsaWNrIHRoZSBtYXAgZmlsZSBoYXZpbmcgdGhlIGVudHJ5PC9saT4KLQk8bGk+Q2xpY2sgVGVhbS0+TG9hZCBNYXAgUHJvamVjdHM8L2xpPgotPC9vbD4KLQotPGgzPkV4cGVjdGVkIFJlc3VsdHM6PC9oMz4KLTxvbD4KLTxsaT5FcnJvciBvY2N1cmVkIGZvciB0aGUgdW5leGlzdGluZyBwcm9qZWN0IGFuZCB0aGUgcHJvamVjdCBpcyBpZ25vcmVkPC9saT4KLTxsaT5Pbmx5IHZhbGlkIHByb2plY3QgaXMgbG9hZGVkPC9saT4KLTwvb2w+Ci0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDU1Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDU1Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOTdlNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA1NS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPlNlbGVjdCBNdWx0aXBsZSBNYXAgRmlsZXMgdG8gTG9hZDwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+U2VsZWN0IE11bHRpcGxlIE1hcCBGaWxlcyB0byBMb2FkPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotCi08aDM+VGVzdCBTdGVwczo8L2gzPgotPG9sPgotCTxsaT5TZWxlY3QgdHdvIG1hcCBmaWxlczwvbGk+Ci0JPGxpPlJpZ2h0IGNsaWNrIHRoZSBtYXAgZmlsZSBoYXZpbmcgdGhlIGVudHJ5PC9saT4KLQk8bGk+Q2xpY2sgVGVhbS0+TG9hZCBNYXAgUHJvamVjdHM8L2xpPgotPC9vbD4KLQotPGgzPkV4cGVjdGVkIFJlc3VsdHM6PC9oMz4KLUFsbCBwcm9qZWN0cyBhcmUgbG9hZGVkCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDU2Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDU2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMjU0ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA1Ni5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk1hcCBGaWxlIENvdGFpbnMgVW5leGlzdGluZyBUYWc8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPk1hcCBGaWxlIENvdGFpbnMgVW5leGlzdGluZyBUYWc8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPlNlbGVjdCBhIG1hcCBmaWxlPC9saT4KLQk8bGk+QWRkIGFuIGVudHJ5IGxpbmUgd2hpY2ggcmVmZXJzIHRvIGFuIGV4aXN0aW5nIHByb2plY3QgYnV0IGNoYW5nZSBpdHMgdGFnIHRvIGEgbmV2ZXIgdXNlZCBvbmU8L2xpPgotCTxsaT5TYXZlIHRoZSBtYXAgZmlsZTwvbGk+Ci0JPGxpPlJpZ2h0IGNsaWNrIHRoZSBtYXAgZmlsZSBoYXZpbmcgdGhlIGVudHJ5PC9saT4KLQk8bGk+Q2xpY2sgVGVhbS0+TG9hZCBNYXAgUHJvamVjdHM8L2xpPgotPC9vbD4KLQotPGgzPkV4cGVjdGVkIFJlc3VsdHM6PC9oMz4KLUVycm9yIG9jY3VyZWQ6IE5vIHN1Y2ggdGFnCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDU3Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDU3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzY4YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA1Ny5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPlByb2plY3QgRG9lcyBOb3QgRXhpc3QgSW4gTG9jYWwgV29ya1NwYWNlPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5Qcm9qZWN0IERvZXMgTm90IEV4aXN0IEluIExvY2FsIFdvcmtTcGFjZTwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPlNlbGVjdCBvbmUgcmVsZWFzZWQgcHJvamVjdDwvbGk+Ci0JPGxpPk1ha2Ugc3VyZSB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgbWFwIGVudHJ5IGZvciB0aGlzIHByb2plY3Q8L2xpPgotCTxsaT5EZWxldGUgdGhlIHByb2plY3QgbG9jYWxseTwvbGk+Ci0JPGxpPlJpZ2h0IGNsaWNrIHRoZSBtYXAgZmlsZSBoYXZpbmcgdGhlIGVudHJ5PC9saT4KLQk8bGk+Q2xpY2sgVGVhbS0+TG9hZCBNYXAgUHJvamVjdHM8L2xpPgotPC9vbD4KLQotPGgzPkV4cGVjdGVkIFJlc3VsdHM6PC9oMz4KLTxvbD4KLTxsaT5UaGUgcHJvamVjdCBpcyBhZGRlZCB0byB0aGUgd29ya3NwYWNlPC9saT4KLTxsaT5BIHRhZyBuYW1lIGFwcGVhcnMgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHByb2plY3QgbmFtZTwvbGk+Ci08bGk+VGhlIHRhZyBpcyBzYW1lIGFzIHRoZSB0YWcgZm9yIHRoaXMgcHJvamVjdCBpbiB0aGUgbWFwIGZpbGU8L2xpPgotPC9vbD4KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNTguaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNTguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxZTk2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDU4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+UHJvamVjdCBFeGlzdHMgaW4gTG9jYWwgV29ya1NwYWNlPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5Qcm9qZWN0IEV4aXN0cyBpbiBMb2NhbCBXb3JrU3BhY2U8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci08aDM+VGVzdCBTdGVwczo8L2gzPgotPG9sPgotCTxsaT5TZWxlY3Qgb25lIHJlbGVhc2VkIHByb2plY3Q8L2xpPgotCTxsaT5NYWtlIHN1cmUgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIG1hcCBlbnRyeSBmb3IgdGhpcyBwcm9qZWN0PC9saT4KLQk8bGk+UmlnaHQgY2xpY2sgdGhlIG1hcCBmaWxlIGhhdmluZyB0aGUgZW50cnk8L2xpPgotCTxsaT5DbGljayBUZWFtLT5Mb2FkIE1hcCBQcm9qZWN0czwvbGk+Ci08L29sPgotCi08aDM+RXhwZWN0ZWQgUmVzdWx0czo8L2gzPgotPG9sPgotPGxpPkEgZGlhbG9nIHBvcHBlZCBvdXQgdG8gcmVtaW5kIHRoYXQgdGhlIHByb2plY3QgZXhpc3RzIGxvY2FsbHk8L2xpPgotPGxpPlRoZSBsb2NhbCBwcm9qZWN0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gaWYgYW5zd2VyICJZZXMiPC9saT4KLTxsaT5UaGUgbG9jYWwgcHJvamVjdCB3aWxsIGhhdmUgbm8gY2hhbmdlIGlmIGFuc3dlciAiTm8iIGZpbGU8L2xpPgotPC9vbD4KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNTkuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNTkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwMzg4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDU5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TWFwIENvbnRhaW5zIEEgT2xkZXIgVGFnIE5hbWU8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPk1hcCBDb250YWlucyBBIE9sZGVyIFRhZyBOYW1lPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotPGgzPlRlc3QgU3RlcHM6PC9oMz4KLTxvbD4KLQk8bGk+U2VsZWN0IG9uZSBwcm9qZWN0IHJlbGVhc2UgaXQgYXMgdGFnMTwvbGk+Ci0JPGxpPlJlbGVhc2UgaXQgYWdhaW4gd2l0aCB0YWcyPC9saT4KLQk8bGk+Q2hhbmdlIHRoZSBwcm9qZWN0J3MgbG9jYWwgdGFnIGluIHRoZSBtYXAgZmlsZSB0byB0YWcxPC9saT4KLQk8bGk+U2F2ZSB0aGUgbWFwIGZpbGU8L2xpPgotCTxsaT5SaWdodCBjbGljayB0aGUgbWFwIGZpbGUgaGF2aW5nIHRoZSBlbnRyeTwvbGk+Ci0JPGxpPkNsaWNrIFRlYW0tPkxvYWQgTWFwIFByb2plY3RzPC9saT4KLTwvb2w+Ci0KLTxoMz5FeHBlY3RlZCBSZXN1bHRzOjwvaDM+Ci08b2w+Ci08bGk+QSBkaWFsb2cgcG9wcGVkIG91dCB0byByZW1pbmQgdGhhdCB0aGUgcHJvamVjdCBleGlzdHMgbG9jYWxseTwvbGk+Ci08bGk+VGhlIGxvY2FsIHByb2plY3Qgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgdmVyc2lvbiB0YWdnZWQgd2l0aCB0YWcxIGlmIGFuc3dlciAiWWVzIjwvbGk+Ci08bGk+VGhlIGxvY2FsIHByb2plY3Qgd2lsbCBoYXZlIG5vIGNoYW5nZSBpZiBhbnN3ZXIgIk5vIiBmaWxlPC9saT4KLTwvb2w+Ci0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDYwLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDYwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYTlkMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA2MC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPlByb2plY3QgVXNpbmcgQ1ZTIE1vZHVsZSBOYW1lPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5Qcm9qZWN0IFVzaW5nIENWUyBNb2R1bGUgTmFtZTwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLTxoMz5UZXN0IFN0ZXBzOjwvaDM+Ci08b2w+Ci0JPGxpPkNyZWF0ZSBhIHByb2plY3Q8L2xpPgotCTxsaT5Db21taXQgaXQgd2l0aCBDVlMgTW9kdWxlIG5hbWUgZGlmZmVyZW50IHRoYW4gbG9jYWwgcHJvamVjdCBuYW1lPC9saT4KLQk8bGk+QWRkIGFuIGVudHJ5IGxpbmUgd2hpY2ggcmVmZXJzIHRvIHRoZSBwcm9qZWN0PC9saT4KLQk8bGk+U2F2ZSB0aGUgbWFwIGZpbGU8L2xpPgotCTxsaT5SZWxlYXNlIHRoZSBwcm9qZWN0PC9saT4KLQk8bGk+RGVsZXRlIHRoZSBwcm9qZWN0IGZyb20gbG9jYWw8L2xpPgotCTxsaT5SaWdodCBjbGljayB0aGUgbWFwIGZpbGUgaGF2aW5nIHRoZSBlbnRyeTwvbGk+Ci0JPGxpPkNsaWNrIFRlYW0tPkxvYWQgTWFwIFByb2plY3RzPC9saT4KLTwvb2w+Ci0KLTxoMz5FeHBlY3RlZCBSZXN1bHRzOjwvaDM+Ci1UaGUgcHJvamVjdCBpcyBsb2FkZWQgYXMgaXRzIENWUyBtb2R1bGUgbmFtZQotCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDYxLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDYxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYmY3Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA2MS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPk9uZSBQcm9qZWN0IENhc2U8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPk9uZSBQcm9qZWN0IENhc2U8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLUFuc3dlciBjb21lcyBoZXJlLgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA2Mi5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA2Mi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGU3NmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNjIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NdWx0aXBsZSBQcm9qZWN0cyBDYXNlPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5NdWx0aXBsZSBQcm9qZWN0cyBDYXNlPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotCi1BbnN3ZXIgY29tZXMgaGVyZS4KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNjMuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNjMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4NDZlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDYzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+Q29tcGFyZSBGaWxlIE9yIEZvbGRlcjwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+Q29tcGFyZSBGaWxlIE9yIEZvbGRlcjwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotQW5zd2VyIGNvbWVzIGhlcmUuCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDY0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDY0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxN2VlNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA2NC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPlJlcGxhY2UgT25lIFByb2plY3Q8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPlJlcGxhY2UgT25lIFByb2plY3Q8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLUFuc3dlciBjb21lcyBoZXJlLgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA2NS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA2NS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjM2MGU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNjUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5SZXBsYWNlIE11bHRpcGxlIFByb2plY3RzPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5SZXBsYWNlIE11bHRpcGxlIFByb2plY3RzPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotCi1BbnN3ZXIgY29tZXMgaGVyZS4KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNjYuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNjYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjY2E1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDY2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+UmVwbGFjZSBBIEZpbGUgT3IgQSBGb2xkZXI8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPlJlcGxhY2UgQSBGaWxlIE9yIEEgRm9sZGVyPC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotCi1BbnN3ZXIgY29tZXMgaGVyZS4KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNjcuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNjcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3NWQ0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDY3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+U2luZ2xlIE1hcCBGaWxlIEFuZCBWYWxpZCBFbnRyaWVzPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5TaW5nbGUgTWFwIEZpbGUgQW5kIFZhbGlkIEVudHJpZXM8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLUFuc3dlciBjb21lcyBoZXJlLgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA2OC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA2OC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWJmMTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNjguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5TaW5nbGUgTWFwIEZpbGUgQW5kIEludmFsaWQgRW50cmllczwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+U2luZ2xlIE1hcCBGaWxlIEFuZCBJbnZhbGlkIEVudHJpZXM8L2gyPgotPHA+U2luY2U6IDxicj4KLUxhc3QgTW9kaWZpZWQ6ICREYXRlOiAyMDA0LzAzLzIzIDE5OjExOjA4ICQ8L3A+PGJvZHk+Ci0KLUFuc3dlciBjb21lcyBoZXJlLgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA2OS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA2OS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTVkOTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNjkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxodG1sPjxoZWFkPjx0aXRsZT5NdWx0aXBsZSBNYXAgRmlsZXM8L3RpdGxlPgotPExJTksgUkVMPVNUWUxFU0hFRVQgSFJFRj0uLi9ib29rLmNzcyBDSEFSU0VUPUlTTy04ODU5LTEgVFlQRT10ZXh0L2Nzcz4KLTxtZXRhIE5BTUU9ImtleXdvcmRzIiBjb250ZW50PSIiPgotPG1ldGEgTkFNRT0ic2luY2UiIGNvbnRlbnQ9IiI+Ci08L2hlYWQ+PGgyPk11bHRpcGxlIE1hcCBGaWxlczwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotQW5zd2VyIGNvbWVzIGhlcmUuCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDcwLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDcwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MDk2NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA3MC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPlByZUNvbmRpdGlvbiBUZXN0PC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5QcmVDb25kaXRpb24gVGVzdDwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotQW5zd2VyIGNvbWVzIGhlcmUuCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDcxLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDcxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODJlYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA3MS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPkluZGl2aWR1YWwgV2l6YXJkIFBhZ2UgQW5kIE9wdGlvbnMgVGVzdDwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+SW5kaXZpZHVhbCBXaXphcmQgUGFnZSBBbmQgT3B0aW9ucyBUZXN0PC9oMj4KLTxwPlNpbmNlOiA8YnI+Ci1MYXN0IE1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wMy8yMyAxOToxMTowOCAkPC9wPjxib2R5PgotCi1BbnN3ZXIgY29tZXMgaGVyZS4KLQotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNzIuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL2h0bWwvMDAwNzIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlZmVkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDcyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08aHRtbD48aGVhZD48dGl0bGU+TWFwIEZpbGVzIEFuZCBNYXAgRW50cmllczwvdGl0bGU+Ci08TElOSyBSRUw9U1RZTEVTSEVFVCBIUkVGPS4uL2Jvb2suY3NzIENIQVJTRVQ9SVNPLTg4NTktMSBUWVBFPXRleHQvY3NzPgotPG1ldGEgTkFNRT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Ci08bWV0YSBOQU1FPSJzaW5jZSIgY29udGVudD0iIj4KLTwvaGVhZD48aDI+TWFwIEZpbGVzIEFuZCBNYXAgRW50cmllczwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotQW5zd2VyIGNvbWVzIGhlcmUuCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDczLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9odG1sLzAwMDczLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOGIxNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaHRtbC8wMDA3My5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPlRhZyBWYWxpZGF0aW9uPC90aXRsZT4KLTxMSU5LIFJFTD1TVFlMRVNIRUVUIEhSRUY9Li4vYm9vay5jc3MgQ0hBUlNFVD1JU08tODg1OS0xIFRZUEU9dGV4dC9jc3M+Ci08bWV0YSBOQU1FPSJrZXl3b3JkcyIgY29udGVudD0iIj4KLTxtZXRhIE5BTUU9InNpbmNlIiBjb250ZW50PSIiPgotPC9oZWFkPjxoMj5UYWcgVmFsaWRhdGlvbjwvaDI+Ci08cD5TaW5jZTogPGJyPgotTGFzdCBNb2RpZmllZDogJERhdGU6IDIwMDQvMDMvMjMgMTk6MTE6MDggJDwvcD48Ym9keT4KLQotQW5zd2VyIGNvbWVzIGhlcmUuCi0KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9pY29ucy9mdWxsL2NsY2wxNi9yZWxlYXNlX2FjdGlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9pY29ucy9mdWxsL2NsY2wxNi9yZWxlYXNlX2FjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NWM0ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvaWNvbnMvZnVsbC9jbGNsMTYvcmVsZWFzZV9hY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNmMDg5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVJlbEVuZz1SZWxFbmcgVG9vbHMKLVJlbEVuZ0FjdGlvblNldC5kZXNjcmlwdGlvbj1SZWxFbmcgVG9vbCBBY3Rpb24gU2V0Ci1SZWxFbmdBY3Rpb25TZXQuUmVsZWFzZT1SZWxlYXNpbmcuLi4KLVJlbEVuZ0FjdGlvblNldC50b29sdGlwPVJlbGVhc2UgUHJvamVjdHMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGM1NDRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMiCi0gICBuYW1lPSJSZWxFbmcgUGx1Zy1pbiIKLSAgIHZlcnNpb249IjMuMC40IgotICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzLlJlbEVuZ1BsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0idG9vbHMuamFyIi8+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiIG9wdGlvbmFsPSJ0cnVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiIG9wdGlvbmFsPSJ0cnVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlYW0uY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpIi8+Ci08IS0tIEJsYW5rZXQgaW1wb3J0cyBmcm9tIHRlYW0gcGx1Z2luLnhtbCAtLT4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlYW0uY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlYW0udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb21wYXJlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzLlJlc291cmNlQ29udHJpYnV0aW9ucyI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0UGVyc2lzdGVudFByb3BlcnR5IgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5yZXBvc2l0b3J5PW9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUuY3ZzbmF0dXJlIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IlJlbGVhc2UuLi4iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzLlRhZ0FuZFJlbGVhc2VBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0idGVhbS5tYWluL2dyb3VwMiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMudGFnQW5kUmVsZWFzZSI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJSZWxlYXNlZCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IkNvbXBhcmUgdGhlIHNlbGVjdGVkIHByb2plY3Qocykgd2l0aCB0aGUgcmVsZWFzZWQgdmVyc2lvbnMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzLkNvbXBhcmVMb2NhbFRvTWFwIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImNvbXBhcmVXaXRoTWVudS9jb21wYXJlV2l0aEdyb3VwIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnJlbGVuZy50b29scy5jb21wYXJlV2l0aFJlbGVhc2VkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IlJlbGVhc2VkIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnJlbGVuZy50b29scy5SZXBsYWNlTG9jYWxGcm9tTWFwIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iUmVwbGFjZSB0aGUgc2VsY3RlZCBwcm9qZWN0KHMpIHdpdGggdGhlIHJlbGVhc2VkIHZlcnNpb25zIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9InJlcGxhY2VXaXRoTWVudS9yZXBsYWNlV2l0aEdyb3VwIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnJlbGVuZy50b29scy5yZXBsYWNlV2l0aFJlbGVhc2VkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLm1hcCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5yZWxlbmcuY3ZzLm1hcEFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IkxvYWQgTWFwIFByb2plY3RzIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnJlbGVuZy50b29scy5Mb2FkTWFwIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9InRlYW0ubWFpbi9ncm91cDEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucmVsZW5nLmN2cy5Mb2FkTWFwIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IlRhZyBNYXAgUHJvamVjdHMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzLlRhZ01hcCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJ0ZWFtLm1haW4vZ3JvdXAxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnJlbGVuZy5jdnMuVGFnTWFwIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucmVsZW5nLmludGVybmFsLnRvb2xzLkNvcHlyaWdodENvbnRyaWJ1dGlvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iRml4IENvcHlyaWdodHMuLi4iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzLkZpeENvcHlyaWdodEFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnJlbGVuZy50b29scy5maXhDb3B5cmlnaHRzIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgCTwhLS0gKioqKioqKioqKiBBY3Rpb24gU2V0cyAqKioqKioqKioqKioqKiAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLQkJPGFjdGlvblNldCAKLQkJCWxhYmVsPSIlUmVsRW5nIiAKLQkJCXZpc2libGU9ImZhbHNlIiAKLQkJCWlkPSJvcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMuUmVsRW5nQWN0aW9uU2V0IgotCQkJZGVzY3JpcHRpb249IiVSZWxFbmdBY3Rpb25TZXQuZGVzY3JpcHRpb24iPgotCSAgCSAgPGFjdGlvbgotCSAgCSAgCXRvb2xiYXJQYXRoPSJOb3JtYWwvUmVsRW5nIFRvb2xzIgotCSAgCQkgbGFiZWw9IiVSZWxFbmdBY3Rpb25TZXQuUmVsZWFzZSIKLQkgIAkJIHRvb2x0aXA9IiVSZWxFbmdBY3Rpb25TZXQudG9vbHRpcCIKLQkgIAkJIGljb249Imljb25zL2Z1bGwvY2xjbDE2L3JlbGVhc2VfYWN0aW9uLmdpZiIKLQkgIAkJIGNsYXNzPSJvcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMuVGFnQW5kUmVsZWFzZUFjdGlvbiIKLQkgIAkJIGlkPSJvcmcuZWNsaXBzZS5lY2xpcHNlLnJlbGVuZy50b29scy5SZWxlYXNlQWN0aW9uIj4gCi0JICAJICAgIDwvYWN0aW9uPgotCSAgPC9hY3Rpb25TZXQ+Ci0JPC9leHRlbnNpb24+Ci0gICAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL0Jsb2NrQ29tbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9CbG9ja0NvbW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgxNjIyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL0Jsb2NrQ29tbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5yZWxlbmcudG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIGRyb2JlcnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBCbG9ja0NvbW1lbnQgewotCi0JaW50IHN0YXJ0OwotCWludCBlbmQ7Ci0JcHJpdmF0ZSBTdHJpbmcgY29udGVudHM7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5ld0xpbmUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0JcHJpdmF0ZSBTdHJpbmcgY29weXJpZ2h0SG9sZGVyOwotCXByaXZhdGUgTGlzdCBub25JQk1Db250cmlidXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBTdHJpbmcgY29tbWVudFN0YXJ0OwotCXByaXZhdGUgU3RyaW5nIGNvbW1lbnRFbmQ7Ci0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY29tbWVudFN0YXJ0Ci0JICogQHBhcmFtIGNvbW1lbnRFbmQKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqLwotCXB1YmxpYyBCbG9ja0NvbW1lbnQoaW50IGNvbW1lbnRTdGFydExpbmUsIGludCBjb21tZW50RW5kTGluZSwgU3RyaW5nIGNvbW1lbnQsIFN0cmluZyBjb21tZW50U3RhcnRTdHJpbmcsIFN0cmluZyBjb21tZW50RW5kU3RyaW5nKSB7Ci0JCXN0YXJ0ID0gY29tbWVudFN0YXJ0TGluZTsKLQkJZW5kID0gY29tbWVudEVuZExpbmU7Ci0JCWNvbW1lbnRTdGFydCA9IGNvbW1lbnRTdGFydFN0cmluZzsKLQkJY29tbWVudEVuZCA9IGNvbW1lbnRFbmRTdHJpbmc7Ci0JCWNvbnRlbnRzID0gY29tbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRzKCkgewotCSAgICByZXR1cm4gY29udGVudHM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb3B5cmlnaHQoKSB7Ci0JCXJldHVybiBjb250ZW50cy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImNvcHlyaWdodCIpICE9IC0xOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGF0VG9wKCkgewotCQlyZXR1cm4gc3RhcnQgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBub3RJQk0oKSB7Ci0JCQotCQlTdHJpbmcgbG93ZXJDYXNlQ29udGVudHMgPSBjb250ZW50cy50b0xvd2VyQ2FzZSgpOwotCQlpZiAoY29weXJpZ2h0SG9sZGVyID09IG51bGwpIHsKLQkJCWludCBzdGFydCA9IGxvd2VyQ2FzZUNvbnRlbnRzLmluZGV4T2YoImNvcHlyaWdodCIpOwotCQkJaWYgKHN0YXJ0ID09IC0xKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpbnQgZW5kID0gbG93ZXJDYXNlQ29udGVudHMuaW5kZXhPZihuZXdMaW5lLCBzdGFydCk7Ci0JCQkKLQkJCWNvcHlyaWdodEhvbGRlciA9IGNvbnRlbnRzLnN1YnN0cmluZyhzdGFydCArICJjb3B5cmlnaHQiLmxlbmd0aCgpLCBlbmQpOwotCQl9Ci0JCQotCQlTdHJpbmcgbG93ZXJjYXNlQ29weXJpZ2h0SG9sZGVyID0gY29weXJpZ2h0SG9sZGVyLnRvTG93ZXJDYXNlKCk7Ci0JCQotCQlpbnQgcmVzdWx0ID0gbG93ZXJjYXNlQ29weXJpZ2h0SG9sZGVyLmluZGV4T2YoImlibSIpOwotCQlpZiAocmVzdWx0ICE9IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJlc3VsdCA9IGxvd2VyY2FzZUNvcHlyaWdodEhvbGRlci5pbmRleE9mKCJpbnRlcm5hdGlvbmFsIGJ1c2luZXNzIG1hY2hpbmUiKTsKLQkJaWYgKHJlc3VsdCAhPSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29weXJpZ2h0SG9sZGVyKCkgewotCQlyZXR1cm4gY29weXJpZ2h0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBMaXN0IG5vbklCTUNvbnRyaWJ1dG9ycygpIHsKLQotCQlTdHJpbmcgbG93ZXJDYXNlQ29udGVudHMgPSBjb250ZW50cy50b0xvd2VyQ2FzZSgpOwotCQlpbnQgc3RhcnQgPSBsb3dlckNhc2VDb250ZW50cy5pbmRleE9mKCJjb250cmlidXRvcnMiKTsKLQkJaWYgKHN0YXJ0ID09IC0xKSB7Ci0JCQlyZXR1cm4gbm9uSUJNQ29udHJpYnV0b3JzOwotCQl9Ci0JCQotCQlzdGFydCA9IGxvd2VyQ2FzZUNvbnRlbnRzLmluZGV4T2YobmV3TGluZSwgc3RhcnQpOwotCQlpZiAoc3RhcnQgPT0gLTEpIHsKLQkJCXJldHVybiBub25JQk1Db250cmlidXRvcnM7Ci0JCX0KLQotCQlzdGFydCA9IHN0YXJ0ICsgbmV3TGluZS5sZW5ndGgoKTsKLQkJQnVmZmVyZWRSZWFkZXIgYVJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGxvd2VyQ2FzZUNvbnRlbnRzLnN1YnN0cmluZyhzdGFydCkpKTsKLQkJCi0JCVN0cmluZyBhTGluZTsKLQkJdHJ5IHsKLQkJCWFMaW5lID0gYVJlYWRlci5yZWFkTGluZSgpOwotCQkJd2hpbGUgKGFMaW5lICE9IG51bGwpIHsKLQkJCQlhTGluZSA9IGFMaW5lLnRyaW0oKTsKLQkJCQlpZiAoKGFMaW5lLmxlbmd0aCgpID4gMCkgJiYgKGFMaW5lLmluZGV4T2YoY29tbWVudEVuZCkgPT0gLTEpKSB7Ci0JCQkJCWlmICgoYUxpbmUuaW5kZXhPZigiaWJtIikgPT0gLTEpICYmIChhTGluZS5pbmRleE9mKCJpbnRlcm5hdGlvbmFsIGJ1c2luZXNzIG1hY2hpbmUiKSA9PSAtMSkpIHsKLQkJCQkJCW5vbklCTUNvbnRyaWJ1dG9ycy5hZGQoYUxpbmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWFMaW5lID0gYVJlYWRlci5yZWFkTGluZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG5vbklCTUNvbnRyaWJ1dG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvQ29tbWl0Q29tbWVudFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvQ29tbWl0Q29tbWVudFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0OGVlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL0NvbW1pdENvbW1lbnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnJlbGVuZy50b29sczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkuQ29tbWl0Q29tbWVudEFyZWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLnVpLndpemFyZHMuQ1ZTV2l6YXJkUGFnZTsKLQotcHVibGljIGNsYXNzIENvbW1pdENvbW1lbnRQYWdlIGV4dGVuZHMgQ1ZTV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIENvbW1pdENvbW1lbnRBcmVhIGNvbW1pdENvbW1lbnRBcmVhOwotCi0JcHVibGljIENvbW1pdENvbW1lbnRQYWdlKAotCQlEaWFsb2cgcGFyZW50RGlhbG9nLAotCQlTdHJpbmcgcGFnZU5hbWUsCi0JCVN0cmluZyB0aXRsZSwKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlLAotCQlTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCQotCQlzdXBlcihwYWdlTmFtZSwgdGl0bGUsIGltYWdlLCBkZXNjcmlwdGlvbik7Ci0JCWNvbW1pdENvbW1lbnRBcmVhID0gbmV3IENvbW1pdENvbW1lbnRBcmVhKHBhcmVudERpYWxvZywgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSB0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQl0b3Auc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzZXRDb250cm9sKHRvcCk7Ci0JCWNvbW1pdENvbW1lbnRBcmVhLmNyZWF0ZUFyZWEodG9wKTsKLSAgICAgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1pdENvbW1lbnRBcmVhLmdldENvbW1lbnQoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNzZXRWaXNpYmxlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUpIHsKLQkJCWNvbW1pdENvbW1lbnRBcmVhLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvQ29tcGFyZUxvY2FsVG9NYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvQ29tcGFyZUxvY2FsVG9NYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkMmZkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL0NvbXBhcmVMb2NhbFRvTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmNvcmUuVGVhbUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMuY29yZS5DVlNDb21wYXJlU3Vic2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMuY29yZS5DVlNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuQ1ZTVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy51aS5hY3Rpb25zLldvcmtzcGFjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkuc3Vic2NyaWJlci5Db21wYXJlUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS51aS5UZWFtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS51aS5zeW5jaHJvbml6ZS5JU3luY2hyb25pemVQYXJ0aWNpcGFudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbXBhcmVzIHRoZSBsb2NhbGx5IHNlbGVjdGVkIHByb2plY3RzIGFnYWluc3RzIHRoZSB2ZXJzaW9ucwotICogZm91bmQgaW4gdGhlIHJlbGVuZyBtYXAgZmlsZXMuIFRoZSByZWxlbmcgbWFwIGZpbGVzIGFyZSBzZWFyY2hlZCBmb3IgaW4gdGhlIAotICogb3JnLmVjbGlwc2UucmVsZW5nIHByb2plY3QgaW4gdGhlIGZvbGRlciBuYW1lZCBtYXBzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXJlTG9jYWxUb01hcCBleHRlbmRzIFdvcmtzcGFjZUFjdGlvbiB7Ci0KLQkvKgotCSAqIEdldCB0aGUgdGFnIGZyb20gdGhlIG1hcCBmaWxlcyBpbiB0aGUgb3JnLmVjbGlwc2UucmVsZW5nIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDVlNFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ1ZTVGFnIGdldFRhZyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJTWFwRW50cnkgZW50cnkgPSBnZXRNYXBQcm9qZWN0KCkuZ2V0TWFwRW50cnkocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKGVudHJ5ID09IG51bGwpIHJldHVybiBDVlNUYWcuREVGQVVMVDsKLQkJcmV0dXJuIGVudHJ5LmdldFRhZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN1cGVyIHdvdWxkIGVuYWJsZSB0aGUgb3B0aW9uICphbmQqCi0JICogb25seSBwcm9qZWN0cyBhcmUgc2VsZWN0ZWQuICBUaGVyZSBpcyBubyBjb25jZXB0IG9mICJyZWxlYXNpbmciCi0JICogYW55dGhpbmcgYnV0IGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwudWkuYWN0aW9ucy5UZWFtQWN0aW9uI2lzRW5hYmxlZCgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkKCkgdGhyb3dzIFRlYW1FeGNlcHRpb24gewotCQkKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5pc0VuYWJsZWQoKTsKLQkJaWYgKCFyZXN1bHQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkKLQkJcmV0dXJuIChnZXRNYXBQcm9qZWN0KCkgIT0gbnVsbCAmJiBnZXRNYXBQcm9qZWN0KCkubWFwc0FyZUxvYWRlZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy51aS5hY3Rpb25zLkNWU0FjdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSUFjdGlvbiBhY3Rpb24pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CQkKLQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLQkJaWYgKHJlc291cmNlcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQlDVlNUYWdbXSB0YWdzID0gbmV3IENWU1RhZ1tyZXNvdXJjZXMubGVuZ3RoXTsJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJdGFnc1tpXSA9IGdldFRhZyhyZXNvdXJjZXNbaV0pOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBzeW5jaHJvbml6ZSB2aWV3IHBhcnRpY2lwYW50Ci0JCUNWU0NvbXBhcmVTdWJzY3JpYmVyIHMgPSBuZXcgQ1ZTQ29tcGFyZVN1YnNjcmliZXIocmVzb3VyY2VzLCB0YWdzLCAiUmVsRW5nIE1hcCIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlzLnByaW1lUmVtb3RlVHJlZSgpOwotCQl9IGNhdGNoIChDVlNFeGNlcHRpb24gZSkgewotCQkJLy8gTG9nIGFuZCBpZ25vcmUKLQkJCVJlbEVuZ1BsdWdpbi5sb2coZSk7Ci0JCX0KLQkJQ29tcGFyZVBhcnRpY2lwYW50IHBhcnRpY2lwYW50ID0gbmV3IENvbXBhcmVQYXJ0aWNpcGFudChzKTsKLQkJVGVhbVVJLmdldFN5bmNocm9uaXplTWFuYWdlcigpLmFkZFN5bmNocm9uaXplUGFydGljaXBhbnRzKG5ldyBJU3luY2hyb25pemVQYXJ0aWNpcGFudFtde3BhcnRpY2lwYW50fSk7Ci0JCXBhcnRpY2lwYW50LnJlZnJlc2gocmVzb3VyY2VzLCAiUmVmcmVzaGluZyIsICJSZWZyZXNoaW5nIiwgZ2V0VGFyZ2V0UGFydCgpLmdldFNpdGUoKSk7Ci0JfQotCXByaXZhdGUgTWFwUHJvamVjdCBnZXRNYXBQcm9qZWN0KCl7Ci0JCXJldHVybiBNYXBQcm9qZWN0LmdldERlZmF1bHRNYXBQcm9qZWN0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9GaXhDb3B5cmlnaHRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvRml4Q29weXJpZ2h0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZGYwOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9GaXhDb3B5cmlnaHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5yZWxlbmcudG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5jb3JlLlRlYW1FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuSUNWU1JlbW90ZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuSUNWU1JlbW90ZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLklMb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMuY29yZS5yZXNvdXJjZXMuQ1ZTV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBGaXhDb3B5cmlnaHRBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0gICAgcHVibGljIGNsYXNzIE15SW5uZXJDbGFzcyBpbXBsZW1lbnRzIElSZXNvdXJjZVZpc2l0b3IgewotICAgICAgICBwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZSgoSUZpbGUpIHJlc291cmNlLCBtb25pdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydGllc0NvcHlyaWdodDsKLSAgICBwcml2YXRlIFN0cmluZyBqYXZhQ29weXJpZ2h0OwotICAgIHByaXZhdGUgU3RyaW5nIG5ld0xpbmUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgcHJpdmF0ZSBNYXAgbG9nID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8vIFRoZSBjdXJyZW50IHNlbGVjdGlvbgotICAgIHByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgY3VycmVudFllYXIgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKS5nZXQoQ2FsZW5kYXIuWUVBUik7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQWN0aW9uMS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRml4Q29weXJpZ2h0QWN0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHJlc291cmNlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3RlZCByZXNvdXJjZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVJlc291cmNlW10gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKSB7Ci0gICAgICAgIEFycmF5TGlzdCByZXNvdXJjZXMgPSBudWxsOwotICAgICAgICBpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGVsZW1lbnRzID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG5leHQgPSBlbGVtZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChuZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBJQWRhcHRhYmxlIGEgPSAoSUFkYXB0YWJsZSkgbmV4dDsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFkYXB0ZXIgPSBhLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5hZGQoYWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwgJiYgIXJlc291cmNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZVtdIHJlc3VsdCA9IG5ldyBJUmVzb3VyY2VbcmVzb3VyY2VzLnNpemUoKV07Ci0gICAgICAgICAgICByZXNvdXJjZXMudG9BcnJheShyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IElSZXNvdXJjZVswXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KElBY3Rpb24sIElXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElBY3Rpb25EZWxlZ2F0ZSNydW4oSUFjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQotICAgICAgICBsb2cgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4odHJ1ZSwgLyogZm9yayAqLwotICAgICAgICAgICAgdHJ1ZSwgLyogY2FuY2VsbGFibGUgKi8KLSAgICAgICAgICAgIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCJGaXhpbmcgY29weXJpZ2h0cy4uLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnQgRml4aW5nIENvcHlyaWdodHMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZVtdIHJlc3VsdHMgPSBnZXRTZWxlY3RlZFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZXMgc2VsZWN0ZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXN1bHRzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXN1bHRzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNvdXJjZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15SW5uZXJDbGFzcyBteUlubmVyQ2xhc3MgPSBuZXcgTXlJbm5lckNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15SW5uZXJDbGFzcy5tb25pdG9yID0gbW9uaXRvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuYWNjZXB0KG15SW5uZXJDbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlTG9ncygpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8JCWRpc3BsYXlMb2dzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgRml4aW5nIENvcHlyaWdodHMiKTsKLQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9va3VwIGFuZCByZXR1cm4gdGhlIHllYXIgaW4gd2hpY2ggdGhlIGFyZ3VtZW50IGZpbGUgd2FzIHJldmlzZWQuICBSZXR1cm4gLTEgaWYKLSAgICAgKiB0aGUgcmV2aXNpb24geWVhciBjYW5ub3QgYmUgZm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Q1ZTTW9kaWZpY2F0aW9uWWVhcihJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCJGZXRjaGluZyBsb2dzIGZyb20gQ1ZTIiwgMTAwKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJQ1ZTUmVtb3RlUmVzb3VyY2UgY3ZzRmlsZSA9IENWU1dvcmtzcGFjZVJvb3QuZ2V0UmVtb3RlUmVzb3VyY2VGb3IoZmlsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN2c0ZpbGUgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGxvZyBlbnRyeSBmb3IgdGhlIHJldmlzaW9uIGxvYWRlZCBpbiB0aGUgd29ya3NwYWNlCi0JICAgICAgICAgICAgICAgIElMb2dFbnRyeSBlbnRyeSA9ICgoSUNWU1JlbW90ZUZpbGUpY3ZzRmlsZSkKLQkgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TG9nRW50cnkobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDApKTsKLQkgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldERhdGUoKS5nZXRZZWFyKCkgKyAxOTAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFRlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVMb2dzKCkgewotCi0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gYVN0cmVhbTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGUgYUZpbGUgPSBuZXcgRmlsZShQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLAotICAgICAgICAgICAgICAgICAgICAiY29weXJpZ2h0TG9nLnR4dCIpOwotICAgICAgICAgICAgYVN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGFGaWxlKTsKLSAgICAgICAgICAgIFNldCBhU2V0ID0gbG9nLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBlcnJvckl0ZXJhdG9yID0gYVNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGVycm9ySXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5IGFuRW50cnkgPSAoTWFwLkVudHJ5KSBlcnJvckl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JEZXNjcmlwdGlvbiA9IChTdHJpbmcpIGFuRW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgYVN0cmVhbS53cml0ZShlcnJvckRlc2NyaXB0aW9uLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgIGFTdHJlYW0ud3JpdGUobmV3TGluZS5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICBMaXN0IGZpbGVMaXN0ID0gKExpc3QpIGFuRW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBsaXN0SXRlcmF0b3IgPSBmaWxlTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChsaXN0SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IChTdHJpbmcpIGxpc3RJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFTdHJlYW0ud3JpdGUoIiAgICAgIi5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgYVN0cmVhbS53cml0ZShmaWxlTmFtZS5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgYVN0cmVhbS53cml0ZShuZXdMaW5lLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGlzcGxheUxvZ3MoKSB7Ci0KLSAgICAgICAgU2V0IGFTZXQgPSBsb2cuZW50cnlTZXQoKTsKLSAgICAgICAgSXRlcmF0b3IgZXJyb3JJdGVyYXRvciA9IGFTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGVycm9ySXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgYW5FbnRyeSA9IChNYXAuRW50cnkpIGVycm9ySXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGVycm9yRGVzY3JpcHRpb24gPSAoU3RyaW5nKSBhbkVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGVycm9yRGVzY3JpcHRpb24pOwotICAgICAgICAgICAgTGlzdCBmaWxlTGlzdCA9IChMaXN0KSBhbkVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBsaXN0SXRlcmF0b3IgPSBmaWxlTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGxpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSAoU3RyaW5nKSBsaXN0SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAiICsgZmlsZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZpbGUoSUZpbGUgZmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIFNvdXJjZUZpbGUgYVNvdXJjZUZpbGU7Ci0KLSAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgICAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIG1vbml0b3Iuc3ViVGFzayhmaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLSAgICAgICAgaW50IGZpbGVUeXBlID0gSUJNQ29weXJpZ2h0Q29tbWVudC5VTktOT1dOX0NPTU1FTlQ7Ci0gICAgICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpOwotICAgICAgICBpZiAoZXh0ZW5zaW9uLmVxdWFscygiamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCWZpbGVUeXBlID0gSUJNQ29weXJpZ2h0Q29tbWVudC5KQVZBX0NPTU1FTlQ7Ci0gICAgICAgICAgICBhU291cmNlRmlsZSA9IG5ldyBKYXZhRmlsZShmaWxlKTsKLSAgICAgICAgfSBlbHNlIGlmIChleHRlbnNpb24uZXF1YWxzKCJwcm9wZXJ0aWVzIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAJZmlsZVR5cGUgPSBJQk1Db3B5cmlnaHRDb21tZW50LlBST1BFUlRJRVNfQ09NTUVOVDsKLSAgICAgICAgICAgIGFTb3VyY2VGaWxlID0gbmV3IFByb3BlcnRpZXNGaWxlKGZpbGUpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoYVNvdXJjZUZpbGUuaGFzTXVsdGlwbGVDb3B5cmlnaHRzKCkpIHsKLSAgICAgICAgICAgIHdhcm4oZmlsZSwgbnVsbCwgIk11bHRpcGxlIGNvcHlyaWdodHMgZm91bmQuICBGaWxlIFVOQ0hBTkdFRC4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJsb2NrQ29tbWVudCBjb3B5cmlnaHRDb21tZW50ID0gYVNvdXJjZUZpbGUuZmlyc3RDb3B5cmlnaHRDb21tZW50KCk7Ci0gICAgICAgIElCTUNvcHlyaWdodENvbW1lbnQgaWJtQ29weXJpZ2h0ID0gSUJNQ29weXJpZ2h0Q29tbWVudC5wYXJzZShjb3B5cmlnaHRDb21tZW50LCBmaWxlVHlwZSk7Ci0gICAgICAgIGlmIChpYm1Db3B5cmlnaHQgPT0gbnVsbCkgewotICAgICAgICAgICAgd2FybihmaWxlLCBjb3B5cmlnaHRDb21tZW50LCAiQ291bGQgbm90IGludGVycHJldCBjb3B5cmlnaHQgY29tbWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaWd1cmUgb3V0IGlmIHRoZSBjb21tZW50IHNob3VsZCBiZSB1cGRhdGVkIGJ5IGNvbXBhcmluZyB0aGUgZGF0ZSByYW5nZQotICAgICAgICAvLyBpbiB0aGUgY29tbWVudCB0byB0aGUgbGFzdCBtb2RpZmljYXRpb24gdGltZSBwcm92aWRlZCBieSBDVlMKLQotICAgICAgICBpbnQgcmV2aXNlZCA9IGlibUNvcHlyaWdodC5nZXRSZXZpc2lvblllYXIoKTsKLSAgICAgICAgaW50IGxhc3RNb2QgPSByZXZpc2VkOwotICAgICAgICBpZiAobGFzdE1vZCA8IGN1cnJlbnRZZWFyKQotICAgICAgICAgICAgbGFzdE1vZCA9IGdldENWU01vZGlmaWNhdGlvblllYXIoZmlsZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLSAgICAgICAgaWYgKGxhc3RNb2QgPD0gcmV2aXNlZCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBlaXRoZXIgcmVwbGFjZSBvbGQgY29weXJpZ2h0IG9yIHB1dCB0aGUgbmV3IG9uZSBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlCi0gICAgICAgIGlibUNvcHlyaWdodC5zZXRSZXZpc2lvblllYXIobGFzdE1vZCk7Ci0gICAgICAgIGlmIChjb3B5cmlnaHRDb21tZW50ID09IG51bGwpCi0gICAgICAgICAgICBhU291cmNlRmlsZS5pbnNlcnQoaWJtQ29weXJpZ2h0LmdldENvcHlyaWdodENvbW1lbnQoKSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKCFjb3B5cmlnaHRDb21tZW50LmF0VG9wKCkpCi0gICAgICAgICAgICAgICAgd2FybihmaWxlLCBjb3B5cmlnaHRDb21tZW50LCAiT2xkIGNvcHlyaWdodCBub3QgYXQgc3RhcnQgb2YgZmlsZSwgbmV3IGNvcHlyaWdodCByZXBsYWNlcyBvbGQgaW4gc2FtZSBsb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBhU291cmNlRmlsZS5yZXBsYWNlKGNvcHlyaWdodENvbW1lbnQsIGlibUNvcHlyaWdodC5nZXRDb3B5cmlnaHRDb21tZW50KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdhcm4oSUZpbGUgZmlsZSwgQmxvY2tDb21tZW50IGZpcnN0QmxvY2tDb21tZW50LAotICAgICAgICAgICAgU3RyaW5nIGVycm9yRGVzY3JpcHRpb24pIHsKLSAgICAgICAgTGlzdCBhTGlzdCA9IChMaXN0KSBsb2cuZ2V0KGVycm9yRGVzY3JpcHRpb24pOwotICAgICAgICBpZiAoYUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgYUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBsb2cucHV0KGVycm9yRGVzY3JpcHRpb24sIGFMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBhTGlzdC5hZGQoZmlsZS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRKYXZhQ29weXJpZ2h0KCkgewotICAgICAgICBpZiAoamF2YUNvcHlyaWdodCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3TGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciBhV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCi0gICAgICAgICAgICBhV3JpdGVyCi0gICAgICAgICAgICAgICAgICAgIC53cml0ZSgiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsKLSAgICAgICAgICAgIGFXcml0ZXIud3JpdGUobmV3TGluZSk7Ci0gICAgICAgICAgICBhV3JpdGVyCi0gICAgICAgICAgICAgICAgICAgIC53cml0ZSgiICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiIpOwotICAgICAgICAgICAgYVdyaXRlci53cml0ZShuZXdMaW5lKTsKLSAgICAgICAgICAgIGFXcml0ZXIKLSAgICAgICAgICAgICAgICAgICAgLndyaXRlKCIgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICIpOwotICAgICAgICAgICAgYVdyaXRlci53cml0ZShuZXdMaW5lKTsKLSAgICAgICAgICAgIGFXcml0ZXIKLSAgICAgICAgICAgICAgICAgICAgLndyaXRlKCIgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMCIpOwotICAgICAgICAgICAgYVdyaXRlci53cml0ZShuZXdMaW5lKTsKLSAgICAgICAgICAgIGFXcml0ZXIKLSAgICAgICAgICAgICAgICAgICAgLndyaXRlKCIgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCIpOwotICAgICAgICAgICAgYVdyaXRlci53cml0ZShuZXdMaW5lKTsKLSAgICAgICAgICAgIGFXcml0ZXIud3JpdGUoIiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIik7Ci0gICAgICAgICAgICBhV3JpdGVyLndyaXRlKG5ld0xpbmUpOwotICAgICAgICAgICAgYVdyaXRlci53cml0ZSgiICogIik7Ci0gICAgICAgICAgICBhV3JpdGVyLndyaXRlKG5ld0xpbmUpOwotICAgICAgICAgICAgYVdyaXRlci53cml0ZSgiICogQ29udHJpYnV0b3JzOiIpOwotICAgICAgICAgICAgYVdyaXRlci53cml0ZShuZXdMaW5lKTsKLSAgICAgICAgICAgIGFXcml0ZXIKLSAgICAgICAgICAgICAgICAgICAgLndyaXRlKCIgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIik7Ci0gICAgICAgICAgICBhV3JpdGVyLndyaXRlKG5ld0xpbmUpOwotICAgICAgICAgICAgYVdyaXRlcgotICAgICAgICAgICAgICAgICAgICAud3JpdGUoIiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyIpOwotICAgICAgICAgICAgYVdyaXRlci53cml0ZShuZXdMaW5lKTsKLSAgICAgICAgICAgIGphdmFDb3B5cmlnaHQgPSBhV3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGphdmFDb3B5cmlnaHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29weXJpZ2h0KCkgewotICAgICAgICBpZiAocHJvcGVydGllc0NvcHlyaWdodCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3TGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciBhV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCi0gICAgICAgICAgICBhV3JpdGVyCi0gICAgICAgICAgICAgICAgICAgIC53cml0ZSgiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIpOwotICAgICAgICAgICAgYVdyaXRlci53cml0ZShuZXdMaW5lKTsKLSAgICAgICAgICAgIGFXcml0ZXIKLSAgICAgICAgICAgICAgICAgICAgLndyaXRlKCIjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4iKTsKLSAgICAgICAgICAgIGFXcml0ZXIud3JpdGUobmV3TGluZSk7Ci0gICAgICAgICAgICBhV3JpdGVyCi0gICAgICAgICAgICAgICAgICAgIC53cml0ZSgiIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICIpOwotICAgICAgICAgICAgYVdyaXRlci53cml0ZShuZXdMaW5lKTsKLSAgICAgICAgICAgIGFXcml0ZXIKLSAgICAgICAgICAgICAgICAgICAgLndyaXRlKCIjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wIik7Ci0gICAgICAgICAgICBhV3JpdGVyLndyaXRlKG5ld0xpbmUpOwotICAgICAgICAgICAgYVdyaXRlcgotICAgICAgICAgICAgICAgICAgICAud3JpdGUoIiMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQiKTsKLSAgICAgICAgICAgIGFXcml0ZXIud3JpdGUobmV3TGluZSk7Ci0gICAgICAgICAgICBhV3JpdGVyLndyaXRlKCIjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIik7Ci0gICAgICAgICAgICBhV3JpdGVyLndyaXRlKG5ld0xpbmUpOwotICAgICAgICAgICAgYVdyaXRlci53cml0ZSgiIyAiKTsKLSAgICAgICAgICAgIGFXcml0ZXIud3JpdGUobmV3TGluZSk7Ci0gICAgICAgICAgICBhV3JpdGVyLndyaXRlKCIjIENvbnRyaWJ1dG9yczoiKTsKLSAgICAgICAgICAgIGFXcml0ZXIud3JpdGUobmV3TGluZSk7Ci0gICAgICAgICAgICBhV3JpdGVyCi0gICAgICAgICAgICAgICAgICAgIC53cml0ZSgiIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIik7Ci0gICAgICAgICAgICBhV3JpdGVyLndyaXRlKG5ld0xpbmUpOwotICAgICAgICAgICAgYVdyaXRlcgotICAgICAgICAgICAgICAgICAgICAud3JpdGUoIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiKTsKLSAgICAgICAgICAgIGFXcml0ZXIud3JpdGUobmV3TGluZSk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzQ29weXJpZ2h0ID0gYVdyaXRlci50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzQ29weXJpZ2h0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvSUJNQ29weXJpZ2h0Q29tbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9JQk1Db3B5cmlnaHRDb21tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNDAxMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9JQk1Db3B5cmlnaHRDb21tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5yZWxlbmcudG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBJQk1Db3B5cmlnaHRDb21tZW50IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV05fQ09NTUVOVCA9IC0xOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ09NTUVOVCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVElFU19DT01NRU5UID0gMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NSRUFUSU9OX1lFQVIgPSAyMDAzOwotCi0gICAgcHJpdmF0ZSBpbnQgY29tbWVudFN0eWxlID0gMDsKLSAgICBwcml2YXRlIGludCBjcmVhdGlvblllYXIgPSAtMTsKLSAgICBwcml2YXRlIGludCByZXZpc2lvblllYXIgPSAtMTsKLSAgICBwcml2YXRlIExpc3QgY29udHJpYnV0b3JzOwotCi0gICAgcHJpdmF0ZSBJQk1Db3B5cmlnaHRDb21tZW50KGludCBjb21tZW50U3R5bGUsIGludCBjcmVhdGlvblllYXIsIGludCByZXZpc2lvblllYXIsIExpc3QgY29udHJpYnV0b3JzKSB7Ci0gICAgICAgIHRoaXMuY29tbWVudFN0eWxlID0gY29tbWVudFN0eWxlOwotICAgICAgICB0aGlzLmNyZWF0aW9uWWVhciA9IGNyZWF0aW9uWWVhciA9PSAtMSA/IERFRkFVTFRfQ1JFQVRJT05fWUVBUiA6IGNyZWF0aW9uWWVhcjsKLSAgICAgICAgdGhpcy5yZXZpc2lvblllYXIgPSByZXZpc2lvblllYXI7Ci0gICAgICAgIHRoaXMuY29udHJpYnV0b3JzID0gY29udHJpYnV0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSUJNQ29weXJpZ2h0Q29tbWVudCBkZWZhdWx0Q29tbWVudChpbnQgY29tbWVudFN0eWxlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSUJNQ29weXJpZ2h0Q29tbWVudChjb21tZW50U3R5bGUsIERFRkFVTFRfQ1JFQVRJT05fWUVBUiwgLTEsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQgY29tbWVudCBidXQgd2l0aCB0aGUgcmV2aXNpb24geWVhcgotICAgICAqIHVwZGF0ZWQgaWYgbmVlZGVkLiAgUmV0dXJuIHRoZSBkZWZhdWx0IGNvbW1lbnQgaWYgdGhlIGFyZ3VtZW50IGNvbW1lbnQgaXMgbnVsbAotICAgICAqIG9yIGFuIGVtcHR5IHN0cmluZy4gIFJldHVybiBudWxsIGlmIHRoZSBhcmd1bWVudCBjb21tZW50IGlzIG5vdCByZWNvZ25pemVkIGFzCi0gICAgICogYW4gSUJNIGNvcHlyaWdodCBjb21tZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUJNQ29weXJpZ2h0Q29tbWVudCBwYXJzZShCbG9ja0NvbW1lbnQgY29tbWVudCwgaW50IGNvbW1lbnRTdHlsZSkgewotICAgICAgICBpZiAoY29tbWVudCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRDb21tZW50KGNvbW1lbnRTdHlsZSk7Ci0gICAgICAgIAotICAgCSAgICBTdHJpbmcgYm9keSA9IGNvbW1lbnQuZ2V0Q29udGVudHMoKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgY29weXJpZ2h0TGFiZWwgPSAiQ29weXJpZ2h0IChjKSAiOyAvLyROT04tTkxTLTEkCi0gICAJICAgIGludCBzdGFydCA9IGJvZHkuaW5kZXhPZihjb3B5cmlnaHRMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLSAgIAkgICAgaWYgKHN0YXJ0ID09IC0xKSByZXR1cm4gbnVsbDsKLSAgIAkgICAgaW50IGNvbnRyaWIgPSBib2R5LmluZGV4T2YoIkNvbnRyaWJ1dG9yczoiLCBzdGFydCk7IC8vJE5PTi1OTFMtMSQKLSAgIAkgICAgaW50IGVuZCA9IGJvZHkuaW5kZXhPZigiIElCTSBDb3JwIiwgc3RhcnQpOyAvLyROT04tTkxTLTEkIC8vIGNhdGNoIGJvdGggSUJNIENvcnBvcmF0aW9uIGFuZCBJQk0gQ29ycC4KLQotICAgCSAgICBpZiAoZW5kID09IC0xIHx8IGVuZCA+IGNvbnRyaWIpIC8vIElCTSBtdXN0IGJlIG9uIHRoZSBjb3B5cmlnaHQgbGluZSwgbm90IHRoZSBjb250cmlidXRvciBsaW5lCi0gICAJICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgCSAgICBTdHJpbmcgeWVhclJhbmdlID0gYm9keS5zdWJzdHJpbmcoc3RhcnQgKyBjb3B5cmlnaHRMYWJlbC5sZW5ndGgoKSwgZW5kKTsKLQotICAgCSAgICBpbnQgY29tbWEgPSB5ZWFyUmFuZ2UuaW5kZXhPZigiLCIpOyAvLyROT04tTkxTLTEkCi0KLSAgIAkgICAgU3RyaW5nIHN0YXJ0U3RyID0gY29tbWEgPT0gLTEgPyB5ZWFyUmFuZ2UgOiB5ZWFyUmFuZ2Uuc3Vic3RyaW5nKDAsIGNvbW1hKTsKLSAgIAkgICAgU3RyaW5nIGVuZFN0ciA9IGNvbW1hID09IC0xID8gbnVsbCA6IHllYXJSYW5nZS5zdWJzdHJpbmcoY29tbWEgKyAxKTsKLQotICAgCSAgICBpbnQgc3RhcnRZZWFyID0gLTE7Ci0gICAJICAgIGlmIChzdGFydFN0ciAhPSBudWxsKQotCSAgIAkgICAgdHJ5IHsKLQkgICAJICAgICAgICBzdGFydFllYXIgPSBJbnRlZ2VyLnBhcnNlSW50KHN0YXJ0U3RyLnRyaW0oKSk7Ci0JICAgCSAgICB9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JICAgCSAgICAgICAgLy8gZG8gbm90aGluZwotCSAgIAkgICAgfQotCi0gICAJICAgIGludCBlbmRZZWFyID0gLTE7Ci0gICAJICAgIGlmIChlbmRTdHIgIT0gbnVsbCkKLSAgIAkgICAgICAgIHRyeSB7Ci0gICAJICAgICAgICAgICAgZW5kWWVhciA9IEludGVnZXIucGFyc2VJbnQoZW5kU3RyLnRyaW0oKSk7Ci0gICAJICAgICAgICB9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAJICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgCSAgICAgICAgfQotCi0gICAJICAgIAotICAgCSAgICBTdHJpbmcgY29udHJpYkNvbW1lbnQgPSBib2R5LnN1YnN0cmluZyhjb250cmliKTsKLSAgIAkgICAgU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29udHJpYkNvbW1lbnQsICJcclxuIik7IC8vJE5PTi1OTFMtMSQKLSAgIAkgICAgdG9rZW5zLm5leHRUb2tlbigpOwotICAgCSAgICBBcnJheUxpc3QgY29udHJpYnV0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTdHJpbmcgbGluZVByZWZpeCA9IGdldExpbmVQcmVmaXgoY29tbWVudFN0eWxlKTsKLSAgIAkgICAgd2hpbGUodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotICAgCSAgICAgICAgU3RyaW5nIGNvbnRyaWJ1dG9yID0gdG9rZW5zLm5leHRUb2tlbigpOwotICAgCSAgICAgICAgaWYgKGNvbnRyaWJ1dG9yLmluZGV4T2YoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIikgPT0gLTEgLy8kTk9OLU5MUy0xJAotICAgCSAgICAgICAgICYmIGNvbnRyaWJ1dG9yLmluZGV4T2YoIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIikgPT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotICAgCSAgICAgICAgICAgIGludCBjID0gY29udHJpYnV0b3IuaW5kZXhPZihsaW5lUHJlZml4KTsKLSAgIAkgICAgICAgICAgICBpZiAoYyAhPSAtMSkKLSAgIAkgICAgICAgICAgICAgICAgY29udHJpYnV0b3IgPSBjb250cmlidXRvci5zdWJzdHJpbmcoYyArIGxpbmVQcmVmaXgubGVuZ3RoKCkpOwotICAgCSAgICAgICAgICAgIGNvbnRyaWJ1dG9ycy5hZGQoY29udHJpYnV0b3IudHJpbSgpKTsKLSAgIAkgICAgICAgIH0KLSAgIAkgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgSUJNQ29weXJpZ2h0Q29tbWVudChjb21tZW50U3R5bGUsIHN0YXJ0WWVhciwgZW5kWWVhciwgY29udHJpYnV0b3JzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFJldmlzaW9uWWVhcigpIHsKLSAgICAgICAgcmV0dXJuIHJldmlzaW9uWWVhciA9PSAtMSA/IGNyZWF0aW9uWWVhciA6IHJldmlzaW9uWWVhcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXZpc2lvblllYXIoaW50IHllYXIpIHsKLSAgICAgICAgaWYgKHJldmlzaW9uWWVhciAhPSAtMSB8fCBjcmVhdGlvblllYXIgIT0geWVhcikKLSAgICAgICAgICAgIHJldmlzaW9uWWVhciA9IHllYXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExpbmVQcmVmaXgoaW50IGNvbW1lbnRTdHlsZSkgewotICAgICAgICBzd2l0Y2goY29tbWVudFN0eWxlKSB7Ci0gICAgICAgIGNhc2UgSkFWQV9DT01NRU5UOgotICAgICAgICAgICAgcmV0dXJuICIgKiAiOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBjYXNlIFBST1BFUlRJRVNfQ09NTUVOVDoKLSAgICAgICAgICAgIHJldHVybiAiIyAiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYm9keSBvZiB0aGlzIGNvcHlyaWdodCBjb21tZW50IG9yIG51bGwgaWYgaXQgY2Fubm90IGJlIGJ1aWx0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29weXJpZ2h0Q29tbWVudCgpIHsKLQkgICAgU3RyaW5nIGxpbmVQcmVmaXggPSBnZXRMaW5lUHJlZml4KGNvbW1lbnRTdHlsZSk7Ci0JICAgIGlmIChsaW5lUHJlZml4ID09IG51bGwpCi0JICAgICAgICByZXR1cm4gbnVsbDsKLQotCSAgICBTdHJpbmdXcml0ZXIgb3V0ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3V0KTsKLQkJdHJ5IHsKLQkJICAgIHdyaXRlQ29tbWVudFN0YXJ0KHdyaXRlcik7Ci0JCQl3cml0ZUxlZ2FsKHdyaXRlciwgbGluZVByZWZpeCk7Ci0JCQl3cml0ZUNvbnRyaWJ1dGlvbnMod3JpdGVyLCBsaW5lUHJlZml4KTsKLQkJICAgIHdyaXRlQ29tbWVudEVuZCh3cml0ZXIpOwotCi0JCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JCX0gZmluYWxseSB7Ci0JCSAgICB3cml0ZXIuY2xvc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNvbW1lbnRTdGFydChQcmludFdyaXRlciB3cml0ZXIpIHsKLQkgICAgc3dpdGNoKGNvbW1lbnRTdHlsZSkgewotCSAgICBjYXNlIEpBVkFfQ09NTUVOVDoKLQkJCXdyaXRlci5wcmludGxuKCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQlicmVhazsKLQkgICAgY2FzZSBQUk9QRVJUSUVTX0NPTU1FTlQ6Ci0JCSAgICB3cml0ZXIucHJpbnRsbigiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIpOyAvLyROT04tTkxTLTEkCi0JCSAgICBicmVhazsKLQkgICAgfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUxlZ2FsKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIGxpbmVQcmVmaXgpIHsKLQkJd3JpdGVyLnByaW50KGxpbmVQcmVmaXggKyAiQ29weXJpZ2h0IChjKSAiICsgY3JlYXRpb25ZZWFyKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmV2aXNpb25ZZWFyICE9IC0xICYmIHJldmlzaW9uWWVhciAhPSBjcmVhdGlvblllYXIpCi0JICAgICAgICB3cml0ZXIucHJpbnQoIiwgIiArIHJldmlzaW9uWWVhcik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCXdyaXRlci5wcmludGxuKGxpbmVQcmVmaXggKyAiQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKGxpbmVQcmVmaXggKyAiYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbihsaW5lUHJlZml4ICsgIndoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4obGluZVByZWZpeCArICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ29udHJpYnV0aW9ucyhQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBsaW5lUHJlZml4KSB7Ci0JCXdyaXRlci5wcmludGxuKGxpbmVQcmVmaXgpOwotCQl3cml0ZXIucHJpbnRsbihsaW5lUHJlZml4ICsgIkNvbnRyaWJ1dG9yczoiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChjb250cmlidXRvcnMgPT0gbnVsbCB8fCBjb250cmlidXRvcnMuc2l6ZSgpIDw9IDApCi0JCSAgICB3cml0ZXIucHJpbnRsbihsaW5lUHJlZml4ICsgIiAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIHsKLQkJCUl0ZXJhdG9yIGkgPSBjb250cmlidXRvcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkKLQkJCSAgICB3cml0ZXIucHJpbnRsbihsaW5lUHJlZml4ICsgIiAgICAiICsgKFN0cmluZylpLm5leHQoKSk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVDb21tZW50RW5kKFByaW50V3JpdGVyIHdyaXRlcikgewotCSAgICBzd2l0Y2goY29tbWVudFN0eWxlKSB7Ci0JICAgIGNhc2UgSkFWQV9DT01NRU5UOgotCQkJd3JpdGVyLnByaW50bG4oIiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyIpOyAvLyROT04tTkxTLTEkCi0JCQlicmVhazsKLQkgICAgY2FzZSBQUk9QRVJUSUVTX0NPTU1FTlQ6Ci0JCSAgICB3cml0ZXIucHJpbnRsbigiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIpOyAvLyROT04tTkxTLTEkCi0JCSAgICBicmVhazsKLQkgICAgfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvSmF2YUZpbGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvSmF2YUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzNjBmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL0phdmFGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogQGF1dGhvciBkcm9iZXJ0cwotICovCi1wdWJsaWMgY2xhc3MgSmF2YUZpbGUgZXh0ZW5kcyBTb3VyY2VGaWxlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICovCi0JcHVibGljIEphdmFGaWxlKElGaWxlIGZpbGUpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgVGVzdC5wb3B1cC5hY3Rpb25zLlNvdXJjZUZpbGUjZ2V0Q29tbWVudFN0YXJ0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnRTdGFydCgpIHsKLQkJcmV0dXJuICIvKiI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgVGVzdC5wb3B1cC5hY3Rpb25zLlNvdXJjZUZpbGUjZ2V0Q29tbWVudEVuZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21tZW50RW5kKCkgewotCQlyZXR1cm4gIiovIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvTG9hZE1hcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9Mb2FkTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MTdjYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9Mb2FkTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnJlbGVuZy50b29sczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uY29yZS5Qcm9qZWN0U2V0Q2FwYWJpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmNvcmUuUmVwb3NpdG9yeVByb3ZpZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmNvcmUuVGVhbUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMuY29yZS5DVlNQcm92aWRlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkuYWN0aW9ucy5DVlNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC51aS5VSVByb2plY3RTZXRTZXJpYWxpemF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIExvYWRNYXAgZXh0ZW5kcyBDVlNBY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkuYWN0aW9ucy5DVlNBY3Rpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElBY3Rpb24gYWN0aW9uKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlydW4obmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihudWxsKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBnZXRTZWxlY3RlZFJlc291cmNlcygpOwotCQkJCQlTdHJpbmdbXSByZWZlcmVuY2VTdHJpbmdzID0gZ2V0UmVmZXJlbmNlU3RyaW5ncyhyZXNvdXJjZXMpOwotCQkJCQlSZXBvc2l0b3J5UHJvdmlkZXJUeXBlIHR5cGUgPSBSZXBvc2l0b3J5UHJvdmlkZXJUeXBlLmdldFByb3ZpZGVyVHlwZShDVlNQcm92aWRlclBsdWdpbi5nZXRUeXBlSWQoKSk7Ci0JCQkJCVByb2plY3RTZXRDYXBhYmlsaXR5IGMgPSB0eXBlLmdldFByb2plY3RTZXRDYXBhYmlsaXR5KCk7Ci0JCQkJCWMuYWRkVG9Xb3Jrc3BhY2UocmVmZXJlbmNlU3RyaW5ncywgbmV3IFVJUHJvamVjdFNldFNlcmlhbGl6YXRpb25Db250ZXh0KGdldFNoZWxsKCksIG51bGwpLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChUZWFtRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9LCB0cnVlLCBQUk9HUkVTU19ESUFMT0cpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCBzZXQgcmVmZXJlbmNlIHN0cmluZ3MgZnJvbSB0aGUgcHJvdmlkZXIgbWFwIGZpbGVzCi0JICogCi0JICogQHBhcmFtIG1hcEZpbGVzCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRSZWZlcmVuY2VTdHJpbmdzKElSZXNvdXJjZVtdIG1hcEZpbGVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3QgYWxsU3RyaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gbWFwRmlsZXNbaV07Ci0JCQlTdHJpbmdbXSByZWZlcmVuY2VTdHJpbmdzID0gcmVhZFJlZmVyZW5jZVN0cmluZ3MoKElGaWxlKXJlc291cmNlKTsKLQkJCWFsbFN0cmluZ3MuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVmZXJlbmNlU3RyaW5ncykpOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIGFsbFN0cmluZ3MudG9BcnJheShuZXcgU3RyaW5nW2FsbFN0cmluZ3Muc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCByZWFkUmVmZXJlbmNlU3RyaW5ncy4KLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4gU3RyaW5nW10KLQkgKi8KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gcmVhZFJlZmVyZW5jZVN0cmluZ3MoSUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGZpbGUuZ2V0Q29udGVudHMoKSkpOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJCUxpc3QgcmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyByZWZlcmVuY2VTdHJpbmcgPSBuZXcgTWFwRW50cnkobGluZSkuZ2V0UmVmZXJlbmNlU3RyaW5nKCk7Ci0JCQkJCWlmIChyZWZlcmVuY2VTdHJpbmcgIT0gbnVsbCkgIHsKLQkJCQkJCXJlZmVyZW5jZXMuYWRkKHJlZmVyZW5jZVN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gKFN0cmluZ1tdKSByZWZlcmVuY2VzLnRvQXJyYXkobmV3IFN0cmluZ1tyZWZlcmVuY2VzLnNpemUoKV0pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBSZWxFbmdQbHVnaW4uSUQsIDAsICJBbiBJL08gZXJyb3Igb2NjdXJlZCIsIGUpKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLnVpLmFjdGlvbnMuVGVhbUFjdGlvbiNpc0VuYWJsZWQoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZCgpIHRocm93cyBUZWFtRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLQkJaWYgKHJlc291cmNlcy5sZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkgcmV0dXJuIGZhbHNlOwotCQkJaWYgKCFyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJtYXAiKSkgcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9NYXBDb250ZW50RG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvTWFwQ29udGVudERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjY2UwMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9NYXBDb250ZW50RG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnJlbGVuZy50b29sczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLklTdHJlYW1Db250ZW50QWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5JVHlwZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMuY29yZS5DVlNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLnVpLkNWU1VJUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBNYXBDb250ZW50RG9jdW1lbnQgaW1wbGVtZW50cyBJVHlwZWRFbGVtZW50LCBJU3RyZWFtQ29udGVudEFjY2Vzc29yewotCXByaXZhdGUgTWFwRmlsZSBtYXBGaWxlOwotCXByaXZhdGUgU3RyaW5nIG9sZENvbnRlbnRzID0gIiI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3Q29udGVudHMgPSAiIjsKLQotCXB1YmxpYyBNYXBDb250ZW50RG9jdW1lbnQoTWFwRmlsZSBhTWFwRmlsZSkgewotCQltYXBGaWxlID0gYU1hcEZpbGU7CQotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBuZXcgY29udGVudHMuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVGFnKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0YWcpIHRocm93cyBDVlNFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXdDb250ZW50cy5nZXRCeXRlcygpKSk7Ci0JCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJ5IHsKLQkJCUJ1ZmZlcmVkUmVhZGVyIGFSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCQlpbnB1dFN0cmVhbSkpOwotCQkJU3RyaW5nIGFMaW5lID0gYVJlYWRlci5yZWFkTGluZSgpOwotCQkJd2hpbGUgKGFMaW5lICE9IG51bGwpIHsKLQkJCQlpZiAoYUxpbmUudHJpbSgpLmxlbmd0aCgpICE9IDAgJiYgIWFMaW5lLnN0YXJ0c1dpdGgoIiEiKSkgewotCQkJCQkvLyBGb3VuZCBhIHBvc3NpYmxlIG1hdGNoCi0JCQkJCU1hcEVudHJ5IGVudHJ5ID0gbmV3IE1hcEVudHJ5KGFMaW5lKTsKLQkJCQkJaWYgKCFlbnRyeS5pc1ZhbGlkKCkpIHsKLQkJCQkJCXRocm93IG5ldyBDVlNFeGNlcHRpb24oIk1hbGZvcm1lZCBtYXAgZmlsZSBsaW5lOiAiCi0JCQkJCQkJCSsgYUxpbmUpOwotCQkJCQl9Ci0JCQkJCWlmIChlbnRyeS5pc01hcHBlZFRvKHByb2plY3QpKSB7Ci0JCQkJCQkvLyBOb3cgZm9yIHN1cmUgd2UgaGF2ZSBhIG1hdGNoLiBSZXBsYWNlIHRoZSBsaW5lLgotCQkJCQkJZW50cnkuc2V0VGFnTmFtZSh0YWcpOwotCQkJCQkJYUxpbmUgPSBlbnRyeS5nZXRNYXBTdHJpbmcoKTsKLQkJCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKGFMaW5lKTsKLQkJCQlhTGluZSA9IGFSZWFkZXIucmVhZExpbmUoKTsKLQkJCQlpZiAoYUxpbmUgIT0gbnVsbCkgewotCQkJCQlidWZmZXIuYXBwZW5kKFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgQ1ZTRXhjZXB0aW9uLndyYXBFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IENWU0V4Y2VwdGlvbi53cmFwRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG1hdGNoKSB7Ci0JCQluZXdDb250ZW50cyA9IGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdlZCgpIHsKLQkJcmV0dXJuICEob2xkQ29udGVudHMuZXF1YWxzKG5ld0NvbnRlbnRzKSk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5JVHlwZWRFbGVtZW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG1hcEZpbGUuZ2V0RmlsZSgpLmdldE5hbWUoKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLklUeXBlZEVsZW1lbnQjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5JVHlwZWRFbGVtZW50I2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIG1hcEZpbGUuZ2V0RmlsZSgpLmdldEZpbGVFeHRlbnNpb24oKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb21wYXJlLklTdHJlYW1Db250ZW50QWNjZXNzb3IjZ2V0Q29udGVudHMoKQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShnZXROZXdDb250ZW50KCkuZ2V0Qnl0ZXMoKSk7Ci0JfQotCXB1YmxpYyBNYXBGaWxlIGdldE1hcEZpbGUoKSB7Ci0JCXJldHVybiBtYXBGaWxlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXROZXdDb250ZW50KCkgewotCQlyZXR1cm4gbmV3Q29udGVudHM7Ci0JfQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJ5IHsKLQkJCWlucHV0U3RyZWFtID0gbWFwRmlsZS5nZXRGaWxlKCkuZ2V0Q29udGVudHMoKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIGFSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCQlpbnB1dFN0cmVhbSkpOwotCQkJU3RyaW5nIGFMaW5lID0gYVJlYWRlci5yZWFkTGluZSgpOwotCQkJd2hpbGUgKGFMaW5lICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKGFMaW5lKTsKLQkJCQlhTGluZSA9IGFSZWFkZXIucmVhZExpbmUoKTsKLQkJCQlpZiAoYUxpbmUgIT0gbnVsbCkgewotCQkJCQlidWZmZXIuYXBwZW5kKFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlvbGRDb250ZW50cyA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJbmV3Q29udGVudHMgPSBuZXcgU3RyaW5nKG9sZENvbnRlbnRzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDVlNVSVBsdWdpbi5vcGVuRXJyb3IobnVsbCwgbnVsbCwgbnVsbCwgZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUNWU1VJUGx1Z2luLm9wZW5FcnJvcihudWxsLCBudWxsLCBudWxsLCBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvTWFwRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvTWFwRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0MTA5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL01hcEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnJlbGVuZy50b29sczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMuY29yZS5DVlNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuQ1ZTVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLklDVlNGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUucmVzb3VyY2VzLkNWU1dvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuc3luY2luZm8uRm9sZGVyU3luY0luZm87Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhY2Nlc3MgdG8gaW5mb3JtYXRpb24gc3RvcmVkIGluIFJlbEVuZyBtYXAgZmlsZXMKLSAqLwotcHVibGljIGNsYXNzIE1hcEVudHJ5IHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBR01FTlQgPSAiZnJhZ21lbnQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFID0gImZlYXR1cmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU4gPSAicGx1Z2luIjsKLQlwcml2YXRlIGJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyB0eXBlID0gIiI7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQgPSAiIjsKLQlwcml2YXRlIFN0cmluZyB0YWdOYW1lID0gIiI7Ci0JcHJpdmF0ZSBTdHJpbmcgcmVwbyA9ICIiOwotCXByaXZhdGUgU3RyaW5nIHBhc3N3b3JkID0gIiI7Ci0JcHJpdmF0ZSBTdHJpbmcgY3ZzTW9kdWxlID0gIiI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgIHsKLQkJLy8gRm9yIHRlc3Rpbmcgb25seQotCQkKLQkJU3RyaW5nW10gc3RyaW5ncyA9IHsKLQkJCSIiLAotCQkJIiAiLAotCQkJInR5cGUiLAotCQkJInR5cGVAIiwKLQkJCSJ0eXBlQGlkIiwKLQkJCSJ0eXBlQGlkPSIsCi0JCQkidHlwZUBpZD10YWcsIiwKLQkJCSJ0eXBlQGlkPXRhZywgY29ubmVjdFN0cmluZyIsCi0JCQkidHlwZUBpZD10YWcsIGNvbm5lY3RTdHJpbmcsIiwKLQkJCSJ0eXBlQGlkPXRhZywgY29ubmVjdFN0cmluZyxwYXNzd29yZCIsCi0JCQkidHlwZUBpZD10YWcsIGNvbm5lY3RTdHJpbmcscGFzc3dvcmQsIiwKLQkJCSJ0eXBlQGlkPXRhZywgY29ubmVjdFN0cmluZyxwYXNzd29yZCxtb2R1bGVOYW1lIiwKLQkJCSJ0eXBlQGlkPXRhZywgY29ubmVjdFN0cmluZywsbW9kdWxlTmFtZSIsCi0JCQkiISoqKioqKioqKioqKioqKiAgRkVBVFVSRSBDT05UUklCVVRJT04gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIsCi0JCQkiQCIsCi0JCQkiPSIsCi0JCQkiLCwsIiwKLQkJCSJAPSwsLCwiLAotCQl9OwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gc3RyaW5nc1tpXTsKLQkJCU1hcEVudHJ5IGFuRW50cnkgPSBuZXcgTWFwRW50cnkoc3RyaW5nKTsKLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdHJpbmcpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKGFuRW50cnkuZ2V0TWFwU3RyaW5nKCkpOwotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oYW5FbnRyeS5nZXRSZWZlcmVuY2VTdHJpbmcoKSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotCQkJYW5FbnRyeS5kaXNwbGF5KCk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNwbGF5KCkgewotCQkvLyBGb3IgdGVzdGluZyBvbmx5Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSXMgVmFsaWQ6ICIgKyBpc1ZhbGlkKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGU6ICIgKyBnZXRUeXBlKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2plY3QgTmFtZTogIiArIGdldElkKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlZlcnNpb246ICIgKyBnZXRUYWdOYW1lKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbm5lY3Q6ICIgKyBnZXRSZXBvKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBhc3N3b3JkOiAiICsgZ2V0UGFzc3dvcmQoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQ1ZTIE1vZHVsZTogIiArIGdldENWU01vZHVsZSgpKTsKLQl9Ci0JCi0JcHVibGljIE1hcEVudHJ5KFN0cmluZyBlbnRyeUxpbmUpIHsKLQkJaW5pdChlbnRyeUxpbmUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG1hcCBlbnRyeSBmb3IgdGhlIGdpdmVuIHByb2plY3QgYW5kIHRhZwotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHRhZwotCSAqLwotCXB1YmxpYyBNYXBFbnRyeShJUHJvamVjdCBwcm9qZWN0LCBDVlNUYWcgdGFnKSB0aHJvd3MgQ1ZTRXhjZXB0aW9uIHsKLQkJdHlwZSA9IGludGVybmFsR2V0VHlwZShwcm9qZWN0KTsKLQkJaWQgPSBwcm9qZWN0LmdldE5hbWUoKTsKLQkJdGFnTmFtZSA9IHRhZy5nZXROYW1lKCk7Ci0JCUZvbGRlclN5bmNJbmZvIGluZm8gPSBDVlNXb3Jrc3BhY2VSb290LmdldENWU0ZvbGRlckZvcihwcm9qZWN0KS5nZXRGb2xkZXJTeW5jSW5mbygpOwotCQlyZXBvID0gaW5mby5nZXRSb290KCk7Ci0JCXBhc3N3b3JkID0gIiI7Ci0JCWN2c01vZHVsZSA9IGluZm8uZ2V0UmVwb3NpdG9yeSgpOwotCQl2YWxpZCA9IHRydWU7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGludGVybmFsR2V0VHlwZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0LmdldEZpbGUoInBsdWdpbi54bWwiKS5leGlzdHMoKSkgcmV0dXJuIFBMVUdJTjsKLQkJaWYgKHByb2plY3QuZ2V0RmlsZSgiZmVhdHVyZS54bWwiKS5leGlzdHMoKSkgcmV0dXJuIEZFQVRVUkU7Ci0JCWlmIChwcm9qZWN0LmdldEZpbGUoImZyYWdtZW50LnhtbCIpLmV4aXN0cygpKSByZXR1cm4gRlJBR01FTlQ7Ci0JCXJldHVybiBQTFVHSU47Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgYSBtYXAgZmlsZSBlbnRyeSBsaW5lCi0JICogQHBhcmFtIGVudHJ5TGluZQotCSAqLwkKLQlwcml2YXRlIHZvaWQgaW5pdChTdHJpbmcgZW50cnlMaW5lKSB7Ci0KLQkJdmFsaWQgPSBmYWxzZTsKLQkKLQkJLy8gVHlwZQkKLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IGVuZCA9IGVudHJ5TGluZS5pbmRleE9mKCdAJyk7Ci0JCWlmIChlbmQgPT0gLTEpICByZXR1cm47Ci0JCXR5cGUgPSBlbnRyeUxpbmUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLnRyaW0oKTsKLQkJCi0JCS8vIFByb2plY3QgTmFtZQotCQlzdGFydCA9IGVuZCArIDE7Ci0JCWVuZCA9IGVudHJ5TGluZS5pbmRleE9mKCc9Jywgc3RhcnQpOwotCQlpZiAoZW5kID09IC0xKSByZXR1cm47Ci0JCWlkID0gZW50cnlMaW5lLnN1YnN0cmluZyhzdGFydCwgZW5kKS50cmltKCk7Ci0JCQotCQkvLyBWZXJzaW9uCi0JCXN0YXJ0ID0gZW5kICsgMTsKLQkJZW5kID0gZW50cnlMaW5lLmluZGV4T2YoJywnLCBzdGFydCk7Ci0JCWlmIChlbmQgPT0gLTEpIHJldHVybjsKLQkJdGFnTmFtZSA9IGVudHJ5TGluZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkudHJpbSgpOwotCQotCQkvLyBSZXBvIENvbm5lY3QgU3RyaW5nCi0JCXN0YXJ0ID0gZW5kICsgMTsKLQkJaWYgKHN0YXJ0ID09IGVudHJ5TGluZS5sZW5ndGgoKSkgcmV0dXJuOyAvLyBObyBjb25uZWN0IHN0cmluZyAtIGludmFsaWQKLQkJZW5kID0gZW50cnlMaW5lLmluZGV4T2YoJywnLCBzdGFydCk7Ci0JCWlmIChlbmQgPT0gLTEpICB7Ci0JCQkvLyBUYWlsaW5nICwgbm90IHJlcXVpcmVkIGlmIGNvbm5lY3Qgc3RyaW5nIGlzIGxhc3QgZW50cnkgb24gbGluZS4KLQkJCXJlcG8gPSBlbnRyeUxpbmUuc3Vic3RyaW5nKHN0YXJ0KS50cmltKCk7Ci0JCQl2YWxpZCA9IHRydWU7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSAgewotCQkJcmVwbyA9IGVudHJ5TGluZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkudHJpbSgpOwotCQl9Ci0JCi0JCS8vIEFsbCByZXF1aXJlZCBmaWVsZHMgbWV0LgotCQl2YWxpZCA9IHRydWU7Ci0JCQotCQkvLyBPcHRpb25hbCBQYXNzd29yZC4KLQkJc3RhcnQgPSBlbmQgKyAxOwotCQlpZiAoc3RhcnQgPT0gZW50cnlMaW5lLmxlbmd0aCgpKSByZXR1cm47ICAvLyBFbmQgb2YgbGluZSByZWFjaGVkLiAgTm8gcGFzc3dvcmQKLQkJZW5kID0gZW50cnlMaW5lLmluZGV4T2YoJywnLCBzdGFydCk7Ci0JCWlmIChlbmQgPT0gLTEpICB7Ci0JCQkvLyBObyB0cmFpbGluZyAsIGJ1dCBwYXNzd29yZCBwcmVzZW50LgotCQkJcGFzc3dvcmQgPSBlbnRyeUxpbmUuc3Vic3RyaW5nKHN0YXJ0KS50cmltKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gLCBhZnRlciBwYXNzd29yZAotCQlwYXNzd29yZCA9IGVudHJ5TGluZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkudHJpbSgpOwotCQkKLQkJLy8gT3B0aW9uYWwgQ1ZTIE1vZHVsZSBOYW1lCi0JCXN0YXJ0ID0gZW5kICsgMTsKLQkJaWYgKHN0YXJ0ID09IGVudHJ5TGluZS5sZW5ndGgoKSkgIHJldHVybjsgIC8vIE5vIG1vZHVsZSBuYW1lCi0JCWN2c01vZHVsZSA9IGVudHJ5TGluZS5zdWJzdHJpbmcoc3RhcnQpLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhZ05hbWUoKSB7Ci0JCXJldHVybiB0YWdOYW1lOwotCX0KLQkKLQlwdWJsaWMgQ1ZTVGFnIGdldFRhZygpIHsKLQkJaWYgKGdldFRhZ05hbWUoKS5lcXVhbHMoIkhFQUQiKSkgcmV0dXJuIENWU1RhZy5ERUZBVUxUOwotCQlyZXR1cm4gbmV3IENWU1RhZyhnZXRUYWdOYW1lKCksIENWU1RhZy5WRVJTSU9OKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIHBhc3N3b3JkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbEdldENWU01vZHVsZSgpICB7Ci0JCWlmIChjdnNNb2R1bGUuZXF1YWxzKCIiKSkgIHsKLQkJCXJldHVybiBpZDsKLQkJfSBlbHNlICB7Ci0JCQlyZXR1cm4gY3ZzTW9kdWxlOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q1ZTTW9kdWxlKCkgewotCQlyZXR1cm4gY3ZzTW9kdWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwbygpIHsKLQkJcmV0dXJuIHJlcG87Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlU3RyaW5nKCkgIHsKLQkJaWYgKCFpc1ZhbGlkKCkpIHJldHVybiBudWxsOwotCQkvLyBUaGlzIGlzIHRoZSBmb3JtYXQgdXNlZCBieSB0aGUgQ1ZTIElQcm9qZWN0U2VyaWFsaXplcgotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBuZXcgUGF0aChpbnRlcm5hbEdldENWU01vZHVsZSgpKS5sYXN0U2VnbWVudCgpOwotCQlyZXR1cm4gIjEuMCwiICsgZ2V0UmVwbygpICsgIiwiICsgaW50ZXJuYWxHZXRDVlNNb2R1bGUoKSArICIsIiArIHByb2plY3ROYW1lICsgIiwiICsgZ2V0VGFnTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwU3RyaW5nKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gZ2V0VHlwZSgpICsgIkAiICsgZ2V0SWQoKSArICI9IiArIGdldFRhZ05hbWUoKSArICIsIiArIGdldFJlcG8oKSArICIsIiArIGdldFBhc3N3b3JkKCk7Ci0JCWlmICghZ2V0Q1ZTTW9kdWxlKCkuZXF1YWxzKCIiKSB8fCAhZ2V0UGFzc3dvcmQoKS5lcXVhbHMoIiIpKSAgewotCQkJcmVzdWx0ID0gcmVzdWx0ICsgIiwiOwotCQl9Ci0JCXJldHVybiByZXN1bHQgKyBnZXRDVlNNb2R1bGUoKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKLQkJdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBwcm9qZWN0SUQpIHsKLQkJdGhpcy5pZCA9IHByb2plY3RJRDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDVlNNb2R1bGUoU3RyaW5nIHBhdGgpIHsKLQkJdGhpcy5jdnNNb2R1bGUgPSBwYXRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcG8oU3RyaW5nIHJlcG8pIHsKLQkJdGhpcy5yZXBvID0gcmVwbzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXRoaXMudGFnTmFtZSA9IHRhZ05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbGlkKGJvb2xlYW4gdmFsaWQpIHsKLQkJdGhpcy52YWxpZCA9IHZhbGlkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkVudHJ5OiAiICsgZ2V0TWFwU3RyaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWFwRW50cnkpIHsKLQkJCXJldHVybiAoKE1hcEVudHJ5KW9iaikuZ2V0TWFwU3RyaW5nKCkuZXF1YWxzKGdldE1hcFN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgbWFwIGVudHJ5IGlzIG1hcHBlZCB0byB0aGUgZ2l2ZW4gQ1ZTIG1vZHVsZQotCSAqIEBwYXJhbSBtb2R1bGVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkVG8oU3RyaW5nIG1vZHVsZU5hbWUpIHsKLQkJSVBhdGggZW50cnlQYXRoID0gbmV3IFBhdGgoaW50ZXJuYWxHZXRDVlNNb2R1bGUoKSk7Ci0JCUlQYXRoIG1vZHVsZVBhdGggPSBuZXcgUGF0aChtb2R1bGVOYW1lKTsKLQkJaWYgKGVudHJ5UGF0aC5zZWdtZW50Q291bnQoKSAhPSBtb2R1bGVQYXRoLnNlZ21lbnRDb3VudCgpKSByZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cnlQYXRoLnNlZ21lbnRDb3VudCgpOyBpKyspIHsKLQkJCWlmICghZW50cnlQYXRoLnNlZ21lbnQoaSkuZXF1YWxzKG1vZHVsZVBhdGguc2VnbWVudChpKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbnRyeSBpcyBtYXBwZWQgdG8gdGhlIGdpdmVuIHByb2plY3QKLQkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZFRvKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU3RyaW5nIG1vZHVsZU5hbWU7Ci0JCXRyeSB7Ci0JCQltb2R1bGVOYW1lID0gZ2V0Q1ZTTW9kdWxlKHByb2plY3QpOwotCQkJaWYgKG1vZHVsZU5hbWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIGlzTWFwcGVkVG8obW9kdWxlTmFtZSk7Ci0JCX0gY2F0Y2ggKENWU0V4Y2VwdGlvbiBlKSB7Ci0JCQlSZWxFbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHJlbW90ZSBDVlMgbW9kdWxlIGZvciB0aGUgcHJvamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIHRoZSBwcm9qZWN0IGlzIG5vdCBhIENWUyBwcm9qZWN0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENWU01vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ1ZTRXhjZXB0aW9uIHsKLQkJSUNWU0ZvbGRlciBmb2xkZXIgPSBDVlNXb3Jrc3BhY2VSb290LmdldENWU0ZvbGRlckZvcihwcm9qZWN0KTsKLQkJRm9sZGVyU3luY0luZm8gaW5mbyA9IGZvbGRlci5nZXRGb2xkZXJTeW5jSW5mbygpOwotCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gaW5mby5nZXRSZXBvc2l0b3J5KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL01hcEZpbGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvTWFwRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjJkNGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvTWFwRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBNYXBGaWxlIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfRklMRV9FWFRFTlNJT04gPSAibWFwIjsKLQkKLQlwcm90ZWN0ZWQgSUZpbGUgZmlsZTsKLQlwcm90ZWN0ZWQgTWFwRW50cnlbXSBlbnRyaWVzOwotCQotCXB1YmxpYyBNYXBGaWxlKElGaWxlIGFGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbGUgPSBhRmlsZTsKLQkJbG9hZEVudHJpZXMoKTsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGdldEZpbGUoKXsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWRFbnRyaWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsJCQotCi0JCXRyeSB7Ci0JCQlpbnB1dFN0cmVhbSA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIGFSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCQlpbnB1dFN0cmVhbSkpOwotCQkJU3RyaW5nIGFMaW5lID0gYVJlYWRlci5yZWFkTGluZSgpOwotCQkJd2hpbGUgKGFMaW5lICE9IG51bGwpIHsKLQkJCQlpZiAoaXNNYXBMaW5lKGFMaW5lKSkgewotCQkJCQlsaXN0LmFkZChuZXcgTWFwRW50cnkoYUxpbmUpKTsKLQkJCQl9Ci0JCQkJYUxpbmUgPSBhUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUmVsRW5nUGx1Z2luLklELCAwLCAiQW4gSS9PIEVycm9yIG9jY3VycmVkIHByb2Nlc3MgbWFwIGZpbGUgIiArIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBJZ25vcmUgY2xvc2UgZXhjZXB0aW9ucyBzbyB3ZSBkb24ndCBtYXNrIGFub3RoZXIgZXhjZXB0aW9uCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdGhpcy5lbnRyaWVzID0gKE1hcEVudHJ5W10pIGxpc3QudG9BcnJheShuZXcgTWFwRW50cnlbbGlzdC5zaXplKCldKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzTWFwTGluZShTdHJpbmcgbGluZSkgewotCQlpZiAobGluZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIGZhbHNlOwotCQlpZiAobGluZS5zdGFydHNXaXRoKCIhIikpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElQcm9qZWN0IHByb2plY3QpewotCQlmb3IoaW50IGogPSAwO2ogPCBlbnRyaWVzLmxlbmd0aDsgaisrKXsKLQkJCWlmIChlbnRyaWVzW2pdLmlzTWFwcGVkVG8ocHJvamVjdCkpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgTWFwRW50cnkgZ2V0TWFwRW50cnkoSVByb2plY3QgcHJvamVjdCkgewotCQlmb3IoaW50IGogPSAwO2ogPCBlbnRyaWVzLmxlbmd0aDsgaisrKXsKLQkJCWlmIChlbnRyaWVzW2pdLmlzTWFwcGVkVG8ocHJvamVjdCkpewotCQkJCXJldHVybiBlbnRyaWVzW2pdOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdFtdIGdldEFjY2Vzc2libGVQcm9qZWN0cygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlpZihlbnRyaWVzID09IG51bGwgfHwgZW50cmllcy5sZW5ndGggPT0wKSByZXR1cm4gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspewotCQkJCQlpZiAoZW50cmllc1tqXS5pc01hcHBlZFRvKHByb2plY3QpKSB7Ci0JCQkJCQlsaXN0LmFkZChwcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElQcm9qZWN0W10pbGlzdC50b0FycmF5KG5ldyBJUHJvamVjdFtsaXN0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZpbGUuZ2V0TmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9NYXBGaWxlQ29tcGFyZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL01hcEZpbGVDb21wYXJlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwMmE2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL01hcEZpbGVDb21wYXJlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnJlbGVuZy50b29sczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5SZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5zdHJ1Y3R1cmVtZXJnZXZpZXdlci5EaWZmTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLnN0cnVjdHVyZW1lcmdldmlld2VyLkRpZmZlcmVuY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIuSURpZmZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuQ1ZTRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLkNWU1RhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkuQ1ZTVUlQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBleHRlbmRzPGNvZGU+Q29tcGFyZUVkaXRvcklucHV0PGNvZGU+LiBJdCBkZWZpbmVzIHRoZSBpbnB1dCBmb3IgbWFwIGZpbGUgY29tcGFyZSBlZGl0b3IsIHdoaWNoIGlzIHNob3dlZCBieQotICogPGNvZGU+TWFwRmlsZUNvbXBhcmVQYWdlPGNvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNYXBGaWxlQ29tcGFyZUVkaXRvcklucHV0IGV4dGVuZHMgQ29tcGFyZUVkaXRvcklucHV0IHsKLQkKLQlwcml2YXRlIE1hcENvbnRlbnREb2N1bWVudFtdIGRvY3VtZW50czsKLQlwcml2YXRlIERpZmZOb2RlIHJvb3Q7Ci0JcHJpdmF0ZSBWaWV3ZXIgdmlld2VyOwotCXByaXZhdGUgTWFwUHJvamVjdCBtYXBQcm9qZWN0OwotCQotCXByaXZhdGUgSVByb2plY3RbXSBzZWxlY3RlZFByb2plY3RzOwotCXByaXZhdGUgU3RyaW5nIHRhZzsJLy9UaGUgcHJvcG9zZWQgdGFnCi0KLQkKLQlwdWJsaWMgTWFwRmlsZUNvbXBhcmVFZGl0b3JJbnB1dCgpIHsKLQkJc3VwZXIobmV3IENvbXBhcmVDb25maWd1cmF0aW9uKCkpOwotCQlkb2N1bWVudHMgPSBuZXcgTWFwQ29udGVudERvY3VtZW50WzBdOwotCQlyb290ID0gbmV3IERpZmZOb2RlKERpZmZlcmVuY2VyLk5PX0NIQU5HRSkgewotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX07Ci0JCW1hcFByb2plY3QgPSBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvbXBhcmUuQ29tcGFyZUVkaXRvcklucHV0I3ByZXBhcmVJbnB1dChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHByZXBhcmVJbnB1dChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCUNvbXBhcmVDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldENvbXBhcmVDb25maWd1cmF0aW9uKCk7Ci0JCWNvbmZpZy5zZXRSaWdodEVkaXRhYmxlKGZhbHNlKTsKLQkJY29uZmlnLnNldExlZnRFZGl0YWJsZShmYWxzZSk7Ci0JCWNvbmZpZy5zZXRSaWdodExhYmVsKCJQcm9wb3NlZCBjaGFuZ2UiKTsKLQkJY29uZmlnLnNldExlZnRMYWJlbCgiQ3VycmVudCBjb250ZW50Iik7Ci0JCXJldHVybiByb290OwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUlucHV0KElQcm9qZWN0W10gcHJvamVjdHMsIFN0cmluZyB0YWcpIHsKLQkJc2V0U2VsZWN0ZWRQcm9qZWN0cyhwcm9qZWN0cyk7Ci0JCXNldFRhZyh0YWcpOwkJCi0JCU1hcENvbnRlbnREb2N1bWVudFtdIGRvY3MgPSBjb25zdHJ1Y3REb2N1bWVudHMoKTsKLQkJc2V0RG9jdW1lbnRzKGRvY3MpOwotCQlidWlsZFRyZWUoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlRWRpdG9ySW5wdXQjY3JlYXRlRGlmZlZpZXdlcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIFZpZXdlciBjcmVhdGVEaWZmVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdmlld2VyID0gIHN1cGVyLmNyZWF0ZURpZmZWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLnNldElucHV0KHRoaXMpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVNYXBQcm9qZWN0KE1hcFByb2plY3QgbSl7Ci0JCW1hcFByb2plY3QgPSBtOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREb2N1bWVudHMoTWFwQ29udGVudERvY3VtZW50W10gZG9jcykgewotCQl0aGlzLmRvY3VtZW50cyA9IGRvY3M7Ci0JfQotCQotCQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHJlZSgpIHsKLQkJaWYoZG9jdW1lbnRzICA9PSBudWxsIHx8IGRvY3VtZW50cy5sZW5ndGggPT0gMClyZXR1cm47Ci0JCS8vRW1wdHkgdGhlIHRyZWUKLQkJaWYocm9vdC5oYXNDaGlsZHJlbigpKXsKLQkJCUlEaWZmRWxlbWVudFtdIGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZHJlbigpOwotCQkJZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKXsKLQkJCQlyb290LnJlbW92ZShjaGlsZHJlbltpXSk7Ci0JCQl9Ci0JCX0KLQotCQkvL3JlYnVpbGQgdGhlIHRyZWUKLQkJRGlmZk5vZGVbXSBkaWZmTm9kZXMgPSBuZXcgRGlmZk5vZGVbZG9jdW1lbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGlmZk5vZGVzLmxlbmd0aDsgaSsrKXsKLQkJCVJlc291cmNlTm9kZSByZXNvdXJjZU5vZGUgPSBuZXcgUmVzb3VyY2VOb2RlKGRvY3VtZW50c1tpXS5nZXRNYXBGaWxlKCkuZ2V0RmlsZSgpKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gCi0JCQl9OwotCQkJCQkJCi0JCQlkaWZmTm9kZXNbaV0gPSBuZXcgRGlmZk5vZGUocm9vdCwgRGlmZmVyZW5jZXIuQ0hBTkdFLCBudWxsLCByZXNvdXJjZU5vZGUsIGRvY3VtZW50c1tpXSkgewotCQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCQkJcmV0dXJuIGdldExlZnQoKS5nZXRJbWFnZSgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJdmlld2VyLnJlZnJlc2goKTsKLQl9IAotCQotCS8qCi0JICogUmV0dXJucyB0aGUgbWFwIGZpbGVzIHRoYXQgd2lsbCBjaGFuZ2UgZHVlIHRvIHRoZSBwcm9qZWN0cyBiZWluZyByZWxlYXNlZAotCSAqLwotCXByaXZhdGUgTWFwRmlsZVtdIGdldENoYW5nZWRNYXBGaWxlcygpIHsKLQkJaWYgKHNlbGVjdGVkUHJvamVjdHMgPT0gbnVsbCB8fCBzZWxlY3RlZFByb2plY3RzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgcHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNWU1RhZ1tdIHRhZ3MgPSBtYXBQcm9qZWN0LmdldFRhZ3NGb3Ioc2VsZWN0ZWRQcm9qZWN0cyApOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRQcm9qZWN0cy5sZW5ndGg7IGkrKyl7Ci0JCQlpZighdGFnc1tpXS5nZXROYW1lKCkuZXF1YWxzKHRhZykpewotCQkJCXByb2plY3RMaXN0LmFkZChzZWxlY3RlZFByb2plY3RzW2ldKTsKLQkJCX0KLQkJfQotCQlJUHJvamVjdCBbXSBwcm9qZWN0cyA9IChJUHJvamVjdFtdKXByb2plY3RMaXN0LnRvQXJyYXkobmV3IElQcm9qZWN0W3Byb2plY3RMaXN0LnNpemUoKV0pOwotCQlyZXR1cm4gbWFwUHJvamVjdC5nZXRNYXBGaWxlc0Zvcihwcm9qZWN0cyk7Ci0JfQotCQotCi0JLy9Db25zdHJ1Y3QgdGhlIGRvY3VtZW50IGFzIHRoZSBkaWZmTm9kZS4gCi0JcHJpdmF0ZSBNYXBDb250ZW50RG9jdW1lbnQgW10gY29uc3RydWN0RG9jdW1lbnRzKCl7Ci0JCU1hcEZpbGVbXSBtYXBGaWxlcyA9IGdldENoYW5nZWRNYXBGaWxlcygpOwotCQlpZihtYXBGaWxlcyA9PSBudWxsIHx8IG1hcEZpbGVzLmxlbmd0aCA9PTApIHJldHVybiBudWxsOwotCQlNYXBDb250ZW50RG9jdW1lbnQgW10gZG9jcyA9IG5ldyBNYXBDb250ZW50RG9jdW1lbnRbbWFwRmlsZXMubGVuZ3RoXTsKLQkJZm9yKGludCBpID0gMDsgaSA8IG1hcEZpbGVzLmxlbmd0aDsgaSsrKXsKLQkJCWRvY3NbaV0gPSBuZXcgTWFwQ29udGVudERvY3VtZW50KG1hcEZpbGVzW2ldKTsKLQkJCWZvcihpbnQgaiA9IDA7IGogPCBzZWxlY3RlZFByb2plY3RzLmxlbmd0aDsgaisrKXsKLQkJCQkvL3VwZGF0ZSB0aGUgbmV3IGNvbnRlbnQgb2YgZWFjaCBzZWxlY3RlZCBwcm9qZWN0cwotCQkJCWlmKG1hcEZpbGVzW2ldLmNvbnRhaW5zKHNlbGVjdGVkUHJvamVjdHNbal0pKXsKLQkJCQkJdHJ5IHsKLQkJCQkJCWRvY3NbaV0uIHVwZGF0ZVRhZyhzZWxlY3RlZFByb2plY3RzW2pdLHRhZyk7Ci0JCQkJCX0gY2F0Y2ggKENWU0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDVlNVSVBsdWdpbi5vcGVuRXJyb3IobnVsbCwgbnVsbCwgbnVsbCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRvY3M7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFByb2plY3RzKElQcm9qZWN0W10gcHJvamVjdHMpIHsKLQkJaWYgKHByb2plY3RzICE9IG51bGwgJiYgcHJvamVjdHMubGVuZ3RoICE9IDApIHsKLQkJCXNlbGVjdGVkUHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdHMubGVuZ3RoIF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByb2plY3RzLCAwLCBzZWxlY3RlZFByb2plY3RzLCAwLCBwcm9qZWN0cy5sZW5ndGgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRUYWcoU3RyaW5nIHQpIHsKLQkJdGhpcy50YWcgPSB0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvTWFwRmlsZUNvbXBhcmVQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL01hcEZpbGVDb21wYXJlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2U0YTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvTWFwRmlsZUNvbXBhcmVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnJlbGVuZy50b29sczsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLnVpLkNWU1VJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTWFwRmlsZUNvbXBhcmVQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0JCi0JcHJpdmF0ZSBNYXBGaWxlQ29tcGFyZUVkaXRvcklucHV0IGlucHV0ID0gbmV3IE1hcEZpbGVDb21wYXJlRWRpdG9ySW5wdXQoKTsKLQlwcml2YXRlIFN0cmluZyB0YWc7Ci0JCi0JcHVibGljIE1hcEZpbGVDb21wYXJlUGFnZShTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyB0aXRsZSwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lLCB0aXRsZSwgaW1hZ2UpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNzZXRWaXNpYmxlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJLy9OZWVkIHRvIGhhbmRsZSBpbnB1dCBhbmQgcmVidWlsZCB0cmVlIG9ubHkgd2hlbiBiZWNvbWluZyB2aXNpYmxlCi0JCWlmKHZpc2libGUpewotCQkJaW5wdXQudXBkYXRlSW5wdXQoKChSZWxlYXNlV2l6YXJkKWdldFdpemFyZCgpKS5nZXRTZWxlY3RlZFByb2plY3RzKCksdGFnKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KGZvbnQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJdHJ5IHsKLQkJCWlucHV0LnJ1bihudWxsKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJQ1ZTVUlQbHVnaW4ub3BlbkVycm9yKGdldFNoZWxsKCksIG51bGwsIG51bGwsIGUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCUNWU1VJUGx1Z2luLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBudWxsLCBudWxsLCBlKTsKLQkJfQotCQkKLQkJQ29udHJvbCBjID0gaW5wdXQuY3JlYXRlQ29udGVudHMoY29tcG9zaXRlKTsKLQkJYy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUYWcoU3RyaW5nIHQpIHsKLQkJdGhpcy50YWcgPSB0OwotCX0KLQlwdWJsaWMgdm9pZCB1cGRhdGVNYXBQcm9qZWN0KE1hcFByb2plY3QgbSl7Ci0JCWlucHV0LnVwZGF0ZU1hcFByb2plY3QobSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9NYXBQcm9qZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL01hcFByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3MTdmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL01hcFByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnJlbGVuZy50b29sczsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uY29yZS5SZXBvc2l0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5jb3JlLlRlYW1FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuQ1ZTVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLkNWU1RlYW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMuY29yZS5jbGllbnQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMuY29yZS5jbGllbnQuQ29tbWl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLmNsaWVudC5Db21tYW5kLkxvY2FsT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy51aS5vcGVyYXRpb25zLkNvbW1pdE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIE1hcFByb2plY3QgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWFwUHJvamVjdCBtYXBQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBNYXBGaWxlW10gbWFwRmlsZXM7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IG1hcCBwcm9qZWN0IChvcmcuZWNsaXBzZS5yZWxlbmcpIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb2plY3QgZG9lcyBub3QgZXhpc3Qgb3IgdGhlcmUKLQkgKiBpcyBhbiBlcnJvciBwcm9jZXNzaW5nIGl0LiBJZiB0aGVyZSBpcyBhbiBlcnJvciwgaXQKLQkgKiB3aWxsIGJlIGxvZ2dlZC4KLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG1hcCBwcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBNYXBQcm9qZWN0IGdldERlZmF1bHRNYXBQcm9qZWN0KCl7CQkKLQkJaWYgKG1hcFByb2plY3QgPT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tV29ya3NwYWNlKCk7Ci0JCQl0cnkgewotCQkJCW1hcFByb2plY3QgPSBuZXcgTWFwUHJvamVjdChwcm9qZWN0KTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVJlbEVuZ1BsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBtYXBQcm9qZWN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbVdvcmtzcGFjZSgpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KFJlbEVuZ1BsdWdpbi5NQVBfUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JcHVibGljIE1hcFByb2plY3QoSVByb2plY3QgcCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLnByb2plY3QgPSBwOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCWxvYWRNYXBGaWxlcygpOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwKXsKLQkJdGhpcy5wcm9qZWN0ID0gcDsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXBGaWxlIGdldE1hcEZpbGUoSVByb2plY3QgcCl7Ci0JCWZvciAoaW50IGkgPSAwOyBpPCBtYXBGaWxlcy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAobWFwRmlsZXNbaV0uY29udGFpbnMocCkpIHsKLQkJCQlyZXR1cm4gbWFwRmlsZXNbaV07Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBNYXBFbnRyeSBmb3IgdGhlIGdpdmVuIHByb2plY3QKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHBhcmFtIHN0cmluZzEKLQkgKi8KLQlwdWJsaWMgTWFwRW50cnkgZ2V0TWFwRW50cnkoSVByb2plY3QgcCkgewotCQlNYXBGaWxlIGZpbGUgPSBnZXRNYXBGaWxlKHApOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmlsZS5nZXRNYXBFbnRyeShwKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXBzQXJlTG9hZGVkKCkgewotCQlyZXR1cm4gcHJvamVjdC5leGlzdHMoKTsKLQl9Ci0gCi0JcHVibGljIE1hcEZpbGVbXSBnZXRWYWxpZE1hcEZpbGVzKCl7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPG1hcEZpbGVzLmxlbmd0aDsgaSsrKXsKLQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBtYXBGaWxlc1tpXS5nZXRBY2Nlc3NpYmxlUHJvamVjdHMoKTsgCi0JCQlpZiggcHJvamVjdHMhPSBudWxsICYmIHByb2plY3RzLmxlbmd0aCA+IDApewotCQkJCWxpc3QuYWRkKG1hcEZpbGVzW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKE1hcEZpbGVbXSlsaXN0LnRvQXJyYXkobmV3IE1hcEZpbGVbbGlzdC5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0IFRoZSBtYXAgZW50cnkgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0IHdpbGwgYmUgY2hhbmdlZCB0byB0aGUgc3BlY2lmaWVkIHRhZwotCSAqIEBwYXJhbSB0YWcgVGhlIHNwZWNpZmllZCB0YWcKLQkgKiBAcmV0dXJuIHJldHVybnMgaWYgbm8gbWFwIGZpbGUgaGF2aW5nIHN1Y2ggYSBtYXAgZW50cnkgaXMgZm91bmQgCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlRmlsZShJUHJvamVjdCBhUHJvamVjdCwgU3RyaW5nIHRhZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlNYXBGaWxlIGFGaWxlID0gZ2V0TWFwRmlsZShhUHJvamVjdCk7Ci0JCWlmIChhRmlsZSA9PSBudWxsKXJldHVybjsKLQkJTWFwQ29udGVudERvY3VtZW50IGNoYW5nZWQgPSBuZXcgTWFwQ29udGVudERvY3VtZW50KGFGaWxlKTsKLQkJY2hhbmdlZC51cGRhdGVUYWcoYVByb2plY3QsIHRhZyk7Ci0JCWlmIChjaGFuZ2VkLmlzQ2hhbmdlZCgpKSB7Ci0JCQlhRmlsZS5nZXRGaWxlKCkuc2V0Q29udGVudHMoY2hhbmdlZC5nZXRDb250ZW50cygpLCBJRmlsZS5LRUVQX0hJU1RPUlksIG51bGwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvbW1pdE1hcFByb2plY3QoU3RyaW5nIGNvbW1lbnQsIElQcm9ncmVzc01vbml0b3IgIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uewotCQlMaXN0IGxvY2FsT3B0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbG9jYWxPcHRpb25zLmFkZChDb21taXQubWFrZUFyZ3VtZW50T3B0aW9uKENvbW1hbmQuTUVTU0FHRV9PUFRJT04sIGNvbW1lbnQpKTsKLQkJTG9jYWxPcHRpb25bXSBjb21tYW5kT3B0aW9ucyA9IChMb2NhbE9wdGlvbltdKWxvY2FsT3B0aW9ucy50b0FycmF5KG5ldyBMb2NhbE9wdGlvbltsb2NhbE9wdGlvbnMuc2l6ZSgpXSk7Ci0JCXRyeSB7Ci0JCQluZXcgQ29tbWl0T3BlcmF0aW9uKG51bGwsIG5ldyBJUmVzb3VyY2VbXSB7IHByb2plY3QgfSwgY29tbWFuZE9wdGlvbnMpLnJ1bihtb25pdG9yKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBUZWFtRXhjZXB0aW9uLmFzVGVhbUV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gSWdub3JlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSAgQ1ZTVGVhbVByb3ZpZGVyIGdldFByb3ZpZGVyKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gKENWU1RlYW1Qcm92aWRlcilSZXBvc2l0b3J5UHJvdmlkZXIuZ2V0UHJvdmlkZXIocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQl9Ci0JCi0JcHVibGljIE1hcEZpbGVbXSBnZXRNYXBGaWxlc0ZvcihJUHJvamVjdFtdIHByb2plY3RzKXsKLQkJU2V0IGFsaXN0ID0gbmV3IEhhc2hTZXQoKTsJCQotCQlmb3IoaW50IGkgPSAwOyBpPHByb2plY3RzLmxlbmd0aDsgaSsrKXsKLQkJCU1hcEZpbGUgYU1hcEZpbGUgPSBnZXRNYXBGaWxlKHByb2plY3RzW2ldKTsKLQkJCWFsaXN0LmFkZChhTWFwRmlsZSk7Ci0JCX0KLQkJcmV0dXJuIChNYXBGaWxlW10pYWxpc3QudG9BcnJheShuZXcgTWFwRmlsZVthbGlzdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHRhZ3MgZm9yIHRoZSBnaXZlbiBwcm9qZWN0cy4gSWYgbm8gdGFnIGlzIGZvdW5kCi0JICogZm9yIHdoYXRldmVyIHJlYXNvbiwgSEVBRCBpcyB1c2VkLgotCSAqIEBwYXJhbSBwcm9qZWN0cwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ1ZTVGFnW10gZ2V0VGFnc0ZvcihJUHJvamVjdFtdIHByb2plY3RzKXsKLQkJaWYocHJvamVjdHMgPT0gbnVsbCB8fCBwcm9qZWN0cy5sZW5ndGggPT0gMClyZXR1cm4gbnVsbDsKLQkJQ1ZTVGFnW10gdGFncyA9IG5ldyBDVlNUYWdbcHJvamVjdHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKXsKLQkJCU1hcEVudHJ5IGVudHJ5ID0gZ2V0TWFwRW50cnkocHJvamVjdHNbaV0pOwotCQkJaWYgKGVudHJ5ID09IG51bGwpIHRhZ3NbaV0gPSBDVlNUYWcuREVGQVVMVDsKLQkJCWVsc2UgdGFnc1tpXSA9IGVudHJ5LmdldFRhZygpOwkJCi0JCX0KLQkJcmV0dXJuIHRhZ3M7Ci0JfQotCS8qKgotCSAqIERlcmVnaXN0ZXIgdGhlIElSZXNvdXJjZUNoYW5nZUxpc3RuZXIuIEl0IGlzIHJlc2VydmVkIGZvciB1c2UgaW4gdGhlIGZ1dHVyZS4gSXQgaXMgbmV2ZXIgY2FsbGVkCi0JICogZm9yIG5vdwotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKXsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlJUmVzb3VyY2VEZWx0YSByb290ID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCi0JCS8vVE9ETzogTmVlZCB0byBhZGQgY29kZSB0byBoYW5kbGUgbWFwIHByb2plY3QgZGVsZXRpb24sIGFkZGl0aW9uIGFuZCByZW5hbWUJCQkKLQkJSVJlc291cmNlRGVsdGEgZm9sZGVyRGVsdGEgPSByb290LmZpbmRNZW1iZXIoZ2V0TWFwRm9sZGVyKCkuZ2V0RnVsbFBhdGgoKSk7Ci0JCWlmIChmb2xkZXJEZWx0YSA9PSBudWxsKSByZXR1cm47Ci0JCQotCQkvL0hhbmRsZSBtYXAgZmlsZXMgZGVsZXRpb24sIGFkZGl0aW9uIGFuZCByZW5hbWUKLQkJSVJlc291cmNlRGVsdGFbXSBkZWx0YXMgPSBmb2xkZXJEZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCWlmKGRlbHRhcyA9PSBudWxsIHx8IGRlbHRhcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBkZWx0YXNbaV07Ci0JCQlpZihkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSl7CQkJCQotCQkJCXRyeXsKLQkJCQkJSUZpbGUgYUZpbGUgPSAoSUZpbGUpKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCQlNYXBGaWxlIG1GaWxlID0gbnVsbDsKLQkJCQkJaWYoaXNNYXBGaWxlKGFGaWxlKSl7Ci0JCQkJCQkvLyBIYW5kbGUgY29udGVudCBjaGFuZ2UKLQkJCQkJCWlmKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKXsJCi0JCQkJCQkJbUZpbGUgPSBnZXRNYXBGaWxlRm9yKGFGaWxlKTsKLQkJCQkJCQltRmlsZS5sb2FkRW50cmllcygpOwkKLQkJCQkJCX0KLQkJCQkJCS8vSGFuZGxlIGRlbGV0aW9uLiBXZSBjYW5ub3Qgc2ltcGx5IHJlbW92ZSB0aGUgbWFwIGZpbGUgZGlyZWN0bHkgYmFjYXVzZSB3ZSBoYXZlIHRvIGNhbGwKLQkJCQkJCS8vZ2V0TWFwRmlsZUZvcihJRmlsZSkgaW4gb3JkZXIgdG8gZG8gc28uIEJ1dCB0aGUgSUZpbGUgaXMgYWxyZWFkeSBkZWxldGVkLiBTbyB3ZSBoYXZlIHRvIAotCQkJCQkJLy9yZWNvbnN0dWN0IHRoZSBtYXAgZmlsZXMuCi0JCQkJCQlpZihkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCApewotCQkJCQkJCWxvYWRNYXBGaWxlcygpOwotCQkJCQkJfQotCQkJCQkJLy8gSGFuZGxlIGFkZGl0aW9uCi0JCQkJCQlpZihkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQgKXsKLQkJCQkJCQltRmlsZSA9IGdldE1hcEZpbGVGb3IoYUZpbGUpOwotCQkJCQkJCWFkZE1hcEZpbGUobUZpbGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVJlbEVuZ1BsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJRm9sZGVyIGdldE1hcEZvbGRlcigpewotCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldEZvbGRlcihSZWxFbmdQbHVnaW4uTUFQX0ZPTERFUik7Ci0JfQotCXByaXZhdGUgdm9pZCBsb2FkTWFwRmlsZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoUmVsRW5nUGx1Z2luLk1BUF9GT0xERVIpOwotCQlpZighZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQltYXBGaWxlcyA9IG5ldyBNYXBGaWxlWzBdOwotCQkJcmV0dXJuOwotCQl9Ci0JCUlSZXNvdXJjZVtdIHJlc291cmNlID0gZm9sZGVyLm1lbWJlcnMoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2UubGVuZ3RoOyBpKyspIHsKLQkJCQkvL0luIGNhc2UgdGhlcmUgYXJlIHNvbWUgc3ViIGZvbGRlcnMKLQkJCQlpZihyZXNvdXJjZVtpXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZVtpXTsKLQkJCQkJaWYoaXNNYXBGaWxlKGZpbGUpKXsKLQkJCQkJCWxpc3QuYWRkKG5ldyBNYXBGaWxlKGZpbGUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW1hcEZpbGVzID0gKE1hcEZpbGVbXSlsaXN0LnRvQXJyYXkobmV3IE1hcEZpbGVbbGlzdC5zaXplKCldKTsKLQkJfSBlbHNlIHsKLQkJCW1hcEZpbGVzID0gbmV3IE1hcEZpbGVbMF07Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBNYXBGaWxlIGdldE1hcEZpbGVGb3IoSUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBtYXBGaWxlcy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAobWFwRmlsZXNbaV0uZ2V0RmlsZSgpLmVxdWFscyhmaWxlKSkKLQkJCQlyZXR1cm4gbWFwRmlsZXNbaV07Ci0JCX0KLQkJcmV0dXJuIG5ldyBNYXBGaWxlKGZpbGUpOwotCX0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTWFwRmlsZShNYXBGaWxlIGFGaWxlKXsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QobWFwRmlsZXMpKTsKLQkJaWYobGlzdC5jb250YWlucyhhRmlsZSkpewotCQkJaWYobGlzdC5zaXplKCkgPD0gMSl7Ci0JCQkJbWFwRmlsZXMgPSBudWxsOwotCQkJfWVsc2V7Ci0JCQkJbGlzdC5yZW1vdmUoYUZpbGUpOwotCQkJCW1hcEZpbGVzID0gKE1hcEZpbGVbXSlsaXN0LnRvQXJyYXkobmV3IE1hcEZpbGVbbGlzdC5zaXplKCldKTsKLQkJCX0KLQkJfQkKLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkZE1hcEZpbGUoTWFwRmlsZSBhRmlsZSl7Ci0JCVNldCBzZXQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KG1hcEZpbGVzKSk7Ci0JCXNldC5hZGQoYUZpbGUpOwotCQltYXBGaWxlcyA9IChNYXBGaWxlW10pc2V0LnRvQXJyYXkobmV3IE1hcEZpbGVbc2V0LnNpemUoKV0pOyAKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGlzTWFwRmlsZShJRmlsZSBhRmlsZSl7Ci0JCVN0cmluZyBleHRlbnNpb24gPSBhRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCS8vSW4gY2FzZSBmaWxlIGhhcyBubyBleHRlbnNpb24gbmFtZSBvciBpcyBub3QgdmFsaWRhdGUgbWFwIGZpbGUKLQkJcmV0dXJuICggZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmVxdWFscyhNYXBGaWxlLk1BUF9GSUxFX0VYVEVOU0lPTikpOyAKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL01hcFByb2plY3RTZWxlY3Rpb25QYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL01hcFByb2plY3RTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYmMyYzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9NYXBQcm9qZWN0U2VsZWN0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnJlbGVuZy50b29sczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uY29yZS5SZXBvc2l0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlU29ydGVyOwotCi1wdWJsaWMgY2xhc3MgTWFwUHJvamVjdFNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzOwotCXByaXZhdGUgTWFwUHJvamVjdCBtYXBQcm9qZWN0OwotCXByaXZhdGUgVHJlZVZpZXdlciBwcm9qZWN0VHJlZTsKLQlwcml2YXRlIEJ1dHRvbiB1c2VEZWZhdWx0QnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHVzZU90aGVyQnV0dG9uOwotCXByaXZhdGUgYm9vbGVhbiB1c2VEZWZhdWx0czsKLQlwcml2YXRlIFN0cmluZyBERUZBVUxUX0JVVFRPTl9LRVk7Ci0JcHJpdmF0ZSBTdHJpbmcgU0VMRUNURURfUFJPSkVDVF9LRVk7Ci0JCi0JcHVibGljIE1hcFByb2plY3RTZWxlY3Rpb25QYWdlKFN0cmluZyBwYWdlTmFtZSwgCi0JCQlTdHJpbmcgdGl0bGUsIAotCQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzLCAKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZSkgewotCQlzdXBlcihwYWdlTmFtZSwgdGl0bGUsIGltYWdlKTsKLQkJdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewkJCi0JCUNvbXBvc2l0ZSB0b3BDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQl0b3BDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl0b3BDb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQkJCi0JCXVzZURlZmF1bHRCdXR0b24gPSBuZXcgQnV0dG9uKHRvcENvbnRhaW5lciwgU1dULlJBRElPKTsKLQkJdXNlRGVmYXVsdEJ1dHRvbi5zZXRUZXh0KCJVc2UgZGVmYXVsdCBtYXAgcHJvamVjdCAob3JnLmVjbGlwc2UucmVsZW5nKSIpOyAKLQkJdXNlRGVmYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1c2VEZWZhdWx0cyA9IHVzZURlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJdXBkYXRlT3RoZXJzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdXNlT3RoZXJCdXR0b24gPSBuZXcgQnV0dG9uKHRvcENvbnRhaW5lciwgU1dULlJBRElPKTsKLQkJdXNlT3RoZXJCdXR0b24uc2V0VGV4dCgiU3BlY2lmeSB0aGUgbWFwIHByb2plY3QgeW91IHdhbnQgdG8gdXNlIik7Ci0JCXVzZU90aGVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXVzZURlZmF1bHRzID0gIXVzZU90aGVyQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJCXVwZGF0ZU90aGVycygpOwotCQkJfQotCQl9KTsKLQkJCi0JCXByb2plY3RUcmVlID0gY3JlYXRlVHJlZSh0b3BDb250YWluZXIpOwotCQlwcm9qZWN0VHJlZS5zZXRJbnB1dChSZWxFbmdQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJUnVubmFibGUgcmVmcmVzaCA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXByb2plY3RUcmVlLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9OwotCi0gICAgICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLSAgICAgICAgaW5pdGlhbGl6ZWRWaWV3ZXIoKTsKLSAgICAgICAgc2V0Q29udHJvbCh0b3BDb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBUcmVlVmlld2VyIGNyZWF0ZVRyZWUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5oZWlnaHRIaW50PSB0cmVlLmdldEl0ZW1IZWlnaHQoKSAqIDE1OwotCQl0cmVlLnNldExheW91dERhdGEoZ2QpOwotCQlUcmVlVmlld2VyIHJlc3VsdCA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOwotCQlyZXN1bHQuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXJlc3VsdC5zZXRMYWJlbFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCkpOwotCQlyZXN1bHQuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsJCQkJCi0JCQkJdXBkYXRlT3RoZXJzKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXN1bHQuc2V0U29ydGVyKG5ldyBSZXNvdXJjZVNvcnRlcihSZXNvdXJjZVNvcnRlci5OQU1FKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQkKLQotCXByaXZhdGUgdm9pZCB1cGRhdGVNYXBQcm9qZWN0KCl7Ci0JCWlmKHVzZURlZmF1bHRzKXsKLQkJCW1hcFByb2plY3QgPSBNYXBQcm9qZWN0LmdldERlZmF1bHRNYXBQcm9qZWN0KCk7CQkKLQkJfWVsc2V7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pcHJvamVjdFRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiggIXNlbGVjdGlvbi5pc0VtcHR5KCkpewotCQkJCU9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYob2JqIGluc3RhbmNlb2YgSVByb2plY3QpewotCQkJCQl0cnkgewotCQkJCQkJbWFwUHJvamVjdCA9IG5ldyBNYXBQcm9qZWN0KChJUHJvamVjdClvYmopOwotCQkJCQkJaWYobWFwUHJvamVjdC5nZXRWYWxpZE1hcEZpbGVzKCkubGVuZ3RoID09IDApewotCQkJCQkJCW1hcFByb2plY3QgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCW1hcFByb2plY3QgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfWVsc2V7Ci0JCQkJbWFwUHJvamVjdCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYoaXNWYWxpZChtYXBQcm9qZWN0KSl7Ci0JCQkoKFJlbGVhc2VXaXphcmQpZ2V0V2l6YXJkKCkpLmJvYWRjYXN0TWFwUHJvamVjdENoYW5nZShtYXBQcm9qZWN0KTsKLQkJCXNldFBhZ2VDb21wbGV0ZSggdHJ1ZSk7Ci0JCX1lbHNlewotCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVkVmlld2VyKCl7Ci0JCWlmKHNldHRpbmdzID09IG51bGwpewotCQkJdXNlRGVmYXVsdHMgPSB0cnVlOwotCQl9ZWxzZXsKLQkJCXJlYWRTZXR0aW5ncygpOwotCQl9Ci0JCXVzZURlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKHVzZURlZmF1bHRzKTsKLQkJdXNlT3RoZXJCdXR0b24uc2V0U2VsZWN0aW9uKCF1c2VEZWZhdWx0cyk7Ci0JCXVwZGF0ZU90aGVycygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlT3RoZXJzKCl7Ci0JCXByb2plY3RUcmVlLmdldFRyZWUoKS5zZXRFbmFibGVkKCF1c2VEZWZhdWx0cyk7Ci0JCXVwZGF0ZU1hcFByb2plY3QoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlYWRTZXR0aW5ncygpewotCQlpZihzZXR0aW5ncy5nZXQoREVGQVVMVF9CVVRUT05fS0VZKSAhPSBudWxsKXsKLQkJCXVzZURlZmF1bHRzID0gc2V0dGluZ3MuZ2V0Qm9vbGVhbihERUZBVUxUX0JVVFRPTl9LRVkpOwotCQl9ZWxzZXsKLQkJCXVzZURlZmF1bHRzID0gdHJ1ZTsKLQkJfQotCQlTdHJpbmcgbmFtZSA9IHNldHRpbmdzLmdldChTRUxFQ1RFRF9QUk9KRUNUX0tFWSk7Ci0JCWlmKCF1c2VEZWZhdWx0cyAmJiBuYW1lICE9IG51bGwpewotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihSZWxFbmdQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSkpOwotCQkJcHJvamVjdFRyZWUuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQlwcm9qZWN0VHJlZS5nZXRUcmVlKCkuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBzYXZlU2V0dGluZ3MoKXsKLQkJc2V0dGluZ3MucHV0KERFRkFVTFRfQlVUVE9OX0tFWSwgdXNlRGVmYXVsdHMpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pcHJvamVjdFRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmKCFzZWxlY3Rpb24uaXNFbXB0eSgpKXsKLQkJCU9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBJUHJvamVjdCl7Ci0JCQkJc2V0dGluZ3MucHV0KFNFTEVDVEVEX1BST0pFQ1RfS0VZLCAoKElQcm9qZWN0KW9iaikuZ2V0TmFtZSgpKTsJCQkKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChmaW5hbCBNYXBQcm9qZWN0IG1hcFByb2plY3QpewotCQkvL0NoZWNrIGlmIG1hcCBwcm9qZWN0IGlzIGFjY2Vzc2libGUKLQkJaWYobWFwUHJvamVjdD09bnVsbCB8fCAoIW1hcFByb2plY3QuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSl7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoIkludmFsaWQgbWFwIHByb2plY3Qgc2VsZWN0ZWQiKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vQ2hlY2sgaWYgdGhlIG1hcCBwcm9qZWN0IGlzIHNoYXJlZAotCQlpZihSZXBvc2l0b3J5UHJvdmlkZXIuZ2V0UHJvdmlkZXIobWFwUHJvamVjdC5nZXRQcm9qZWN0KCkpID09IG51bGwpewotCQkJc2V0RXJyb3JNZXNzYWdlKCJQcm9qZWN0ICIgKyBtYXBQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkrIiBpcyBub3Qgc2hhcmVkIik7CQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDBmMDI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL1Byb2plY3RDb21wYXJlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9Qcm9qZWN0Q29tcGFyZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4MzE5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL1Byb2plY3RDb21wYXJlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb21wYXJlLkNvbXBhcmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uY29yZS5UZWFtRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuQ1ZTQ29tcGFyZVN1YnNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuQ1ZTVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy51aS5DVlNVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkuc3Vic2NyaWJlci5Db21wYXJlUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS51aS5zeW5jaHJvbml6ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICpUaGlzIGNsYXNzIGV4dGVuZHMgPGNvZGU+V2l6YXJkUGFnZTxjb2RlPi4gSXQgdXRpbGl6ZXMgYSA8Y29kZT5QYWdlQm9vazxjb2RlPiB0byBzaG93IHVzZXIKLSAqd2hldGhlciB0aGVyZSBhcmUgYW55IGNoYW5nZWQgcHJvamVjdHMgb3Igbm90IHNpbmNlIGxhc3QgcmVsZWFzZS4gSXQgYWxzbyBzaG93cyBhIGNvbXBhcmUgCi0gKmVkaXRvciBpZiB0aGVyZSBpcyBhbnkgY2hhbmdlZCBwcm9qZWN0IGRldGVjdGVkICAKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RDb21wYXJlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2V7Ci0KLQlwcml2YXRlIFBhZ2VCb29rIHBhZ2VCb29rOwotCXByaXZhdGUgQ29udHJvbCBjb21wYXJlVmlldzsKLQlwcml2YXRlIExhYmVsIG5vbmVDaGFuZ2VNZXNzYWdlOwotCXByaXZhdGUgTWFwUHJvamVjdCBtYXBQcm9qZWN0OwotCXByaXZhdGUgSVN5bmNocm9uaXplUGFnZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLQlwcml2YXRlIFBhcnRpY2lwYW50UGFnZVNhdmVhYmxlUGFydCBpbnB1dDsKLQotCXB1YmxpYyBQcm9qZWN0Q29tcGFyZVBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCAKLQkJCVN0cmluZyB0aXRsZSwgCi0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2UpIHsKLQkJc3VwZXIocGFnZU5hbWUsIHRpdGxlLCBpbWFnZSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOyAKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7CQotCQljb21wb3NpdGUuc2V0Rm9udChmb250KTsKLQkJCi0JCXBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFnZUJvb2suc2V0Rm9udChmb250KTsKLQkJCi0JCWlucHV0ID0gY3JlYXRlQ29tcGFyZUlucHV0KCk7Ci0JCWlucHV0LmNyZWF0ZVBhcnRDb250cm9sKHBhZ2VCb29rKTsKLQkJY29tcGFyZVZpZXcgPSBpbnB1dC5nZXRDb250cm9sKCk7Ci0JCWNvbXBhcmVWaWV3LnNldEZvbnQoZm9udCk7Ci0JCWNvbXBhcmVWaWV3LnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlub25lQ2hhbmdlTWVzc2FnZSA9IG5ldyBMYWJlbChwYWdlQm9vayxTV1QuV1JBUCk7Ci0JCW5vbmVDaGFuZ2VNZXNzYWdlLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcm9qZWN0Q29tcGFyZVBhZ2UuMSIpKTsgLy8kTk9OLU5MUy0xJAotCQlub25lQ2hhbmdlTWVzc2FnZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlub25lQ2hhbmdlTWVzc2FnZS5zZXRGb250KGZvbnQpOwotCQkKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI3NldFZpc2libGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJZmluYWwgUmVsZWFzZVdpemFyZCB3aXphcmQgPSAoUmVsZWFzZVdpemFyZClnZXRXaXphcmQoKTsKLQkJCXRyeSB7Ci0JCQkJLy9HZXQgdXBkYXRlZCBzZWxlY3RlZCBwcm9qZWN0IGluIGNhc2UgdGhhdCBzb21lIHByb2plY3RzIGhhdmUgb3V0Z29pbmcgY2hhbmdlcyBhbmQgZXhjbHVkZWQgYnkgdXNlcgotCQkJCXdpemFyZC51cGRhdGVTZWxlY3RlZFByb2plY3QoKTsKLQkJCQkKLQkJCQkvL0dldCB0aGUgZmluYWxpemVkIHNlbGVjdGVkIHByb2plY3RzIGFuZCB0aGUgYXNzb2NpYXRlZCB0YWdzIGZyb20gZXhpc3RpbmcgbWFwIGZpbGVzCi0JCQkJZmluYWwgSVByb2plY3RbXSBwcm9qZWN0cyA9IHdpemFyZC5nZXRTZWxlY3RlZFByb2plY3RzKCk7Ci0JCQkJZmluYWwgQ1ZTVGFnW10gdGFncyA9IG1hcFByb2plY3QuZ2V0VGFnc0Zvcihwcm9qZWN0cyk7CQkJCi0JCQkJCi0JCQkJLy9Db2xsZWN0IGFsbCB0aGUgb3V0LW9mLXN5bmMgcHJvamVjdHMgZnJvbSBzZWxlY3RlZCBwcm9qZWN0cyBhbmQgdXBkYXRlIHRoZSBzZWxlY3RlZCBwcm9qZWN0IGFnYWluIAotCQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQlJUmVzb3VyY2VbXSByID0gbnVsbDsKLQkJCQkJCWlmKHByb2plY3RzICE9IG51bGwgJiYgcHJvamVjdHMubGVuZ3RoICE9IDApewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXIgPSBnZXRPdXRPZlN5bmNQcm9qZWN0cyhwcm9qZWN0cywgdGFncywgbW9uaXRvcik7Ci0JCQkJCQkJCXdpemFyZC5zZXRTZWxlY3RlZFByb2plY3RzKHIpOwotCQkJCQkJCX0gY2F0Y2ggKFRlYW1FeGNlcHRpb24gZSkgewotCQkJCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQkJCQl9CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCQkvL1Nob3cgbm8tcHJvamVjdC1jaGFuZ2VkIGluZm9ybWF0aW9uIG9uIHRoZSBwYWdlIGJvb2sgaWYgY29uZGl0aW9uIHNhdGlzZmllZAotCQkJCWlmKCB3aXphcmQuZ2V0U2VsZWN0ZWRQcm9qZWN0cygpPT0gbnVsbHx8d2l6YXJkLmdldFNlbGVjdGVkUHJvamVjdHMoKS5sZW5ndGggPT0gMCl7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkJCXBhZ2VCb29rLnNob3dQYWdlKG5vbmVDaGFuZ2VNZXNzYWdlKTsKLQkJCQl9Ci0JCQkJLy9PcGVuIGEgY29tcGFyZSBlZGl0b3Igb3RoZXJ3aXNlCi0JCQkJZWxzZXsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQkJCQlwYWdlQm9vay5zaG93UGFnZShjb21wYXJlVmlldyk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ1ZTVUlQbHVnaW4ub3BlbkVycm9yKGdldFNoZWxsKCksIG51bGwsIG51bGwsIGUpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUNWU1VJUGx1Z2luLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBudWxsLCBudWxsLCBlKTsKLQkJCX0KLQkJfQotCQkvL1doZW4gdGhlIHBhZ2UgaXMgaW52aXNpYmxlLCBpdCBzaG91bGQgbm90IGFmZmVjdCB0aGUgd2l6YXJkIHdvcmsgZmxvdyBieSBhbnl3YXkKLQkJZWxzZSB7Ci0JCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgdXBkYXRlTWFwUHJvamVjdChNYXBQcm9qZWN0IG0pewotCQltYXBQcm9qZWN0ID0gbTsKLQl9Ci0JCi0JcHJpdmF0ZSBQYXJ0aWNpcGFudFBhZ2VTYXZlYWJsZVBhcnQgY3JlYXRlQ29tcGFyZUlucHV0KCkgewkKLQkJSVN5bmNocm9uaXplUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBuZXcgQ29tcGFyZVBhcnRpY2lwYW50KG5ldyBDVlNDb21wYXJlU3Vic2NyaWJlcihuZXcgSVJlc291cmNlWzBdLCBuZXcgQ1ZTVGFnWzBdLCAiUmVsRW5nIFJlbGVhc2UiKSk7Ci0JCWNvbmZpZ3VyYXRpb24gPSBwYXJ0aWNpcGFudC5jcmVhdGVQYWdlQ29uZmlndXJhdGlvbigpOwotCQljb25maWd1cmF0aW9uLnNldE1lbnVHcm91cHMoSVN5bmNocm9uaXplUGFnZUNvbmZpZ3VyYXRpb24uUF9UT09MQkFSX01FTlUsIG5ldyBTdHJpbmdbXSB7IAotCQkJCUlTeW5jaHJvbml6ZVBhZ2VDb25maWd1cmF0aW9uLk5BVklHQVRFX0dST1VQLCAgCi0JCQkJSVN5bmNocm9uaXplUGFnZUNvbmZpZ3VyYXRpb24uTEFZT1VUX0dST1VQIH0pOwotCQljb25maWd1cmF0aW9uLnNldE1lbnVHcm91cHMoSVN5bmNocm9uaXplUGFnZUNvbmZpZ3VyYXRpb24uUF9DT05URVhUX01FTlUsIG5ldyBTdHJpbmdbMF0pOwotCQkKLQkJQ29tcGFyZUNvbmZpZ3VyYXRpb24gY2MgPSBuZXcgQ29tcGFyZUNvbmZpZ3VyYXRpb24oKTsKLQkJY2Muc2V0TGVmdEVkaXRhYmxlKGZhbHNlKTsKLQkJY2Muc2V0UmlnaHRFZGl0YWJsZShmYWxzZSk7Ci0JCVBhcnRpY2lwYW50UGFnZVNhdmVhYmxlUGFydCBwYXJ0ID0gbmV3IFBhcnRpY2lwYW50UGFnZVNhdmVhYmxlUGFydChnZXRTaGVsbCgpLCBjYywgY29uZmlndXJhdGlvbiwgcGFydGljaXBhbnQpOwotCQkKLQkJLy8gd2lsbCBiZSByZXNldCB3aGVuIHNldFZpc2libGUgaXMgY2FsbGVkCi0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJCi0JCXJldHVybiBwYXJ0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaW5wdXQuZ2V0UGFydGljaXBhbnQoKS5kaXNwb3NlKCk7Ci0JCWlucHV0LmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIHByb2plY3RzIHRoYXQgYXJlIG91dC1vZi1zeW5jCi0JICovCi0JcHVibGljIElSZXNvdXJjZVtdIGdldE91dE9mU3luY1Byb2plY3RzKElQcm9qZWN0W10gcHJvamVjdHMsIENWU1RhZ1tdIHRhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFRlYW1FeGNlcHRpb24gewotCQlDb21wYXJlUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSAoQ29tcGFyZVBhcnRpY2lwYW50KWlucHV0LmdldFBhcnRpY2lwYW50KCk7Ci0JCUNWU0NvbXBhcmVTdWJzY3JpYmVyIHN1YnNjcmliZXIgPSAoQ1ZTQ29tcGFyZVN1YnNjcmliZXIpcGFydGljaXBhbnQuZ2V0U3Vic2NyaWJlcigpOwotCQlzdWJzY3JpYmVyLnJlc2V0Um9vdHMocHJvamVjdHMsIHRhZ3MpOwotCQl0cnkgewotCQkJc3Vic2NyaWJlci5wcmltZVJlbW90ZVRyZWUoKTsKLQkJfSBjYXRjaCAoQ1ZTRXhjZXB0aW9uIGUpIHsKLQkJCS8vIExvZyBhbmQgaWdub3JlCi0JCQlSZWxFbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXBhcnRpY2lwYW50LnJlZnJlc2hOb3cocHJvamVjdHMsICIiLCBtb25pdG9yKTsKLQkJSVJlc291cmNlW10gciA9IHBhcnRpY2lwYW50LmdldFN5bmNJbmZvU2V0KCkubWVtYmVycyhSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJcmV0dXJuIHI7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL1Byb2plY3RTZWxlY3Rpb25QYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL1Byb2plY3RTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzkyNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9Qcm9qZWN0U2VsZWN0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5Db250YWluZXJDaGVja2VkVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgZXh0ZW5kcyA8Y29kZT5XaXphcmRQYWdlPGNvZGU+IGNsYXNzIGFuZCB1c2UgYSA8Y29kZT5DaGVja2JveFRyZWVWaWV3ZXI8Y29kZT4gdG8gCi0gKiBkaXNwbGF5IHNlbGVjdGFibGUgaXRlbXMuIAotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQlwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlciB2aWV3ZXI7Ci0JcHJpdmF0ZSBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M7Ci0JcHJpdmF0ZSBCdXR0b24gY29tcGFyZUJ1dHRvbjsKLQlwcml2YXRlIGJvb2xlYW4gY29tcGFyZUJ1dHRvbkNoZWNrZWQ7CQotCXByaXZhdGUgU3RyaW5nIFNFTEVDVEVEX0lURU1TX0tFWSA9IE1lc3NhZ2VzLmdldFN0cmluZygiUHJvamVjdFNlbGVjdGlvblBhZ2UuMCIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgQ09NUEFSRV9CVVRUT05fS0VZID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcm9qZWN0U2VsZWN0aW9uUGFnZS4xIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE1hcFByb2plY3QgbWFwUHJvamVjdDsKLQotCXByaXZhdGUgY2xhc3MgTWFwRmlsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJV29ya2JlbmNoTGFiZWxQcm92aWRlciBwcm92aWRlciA9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNYXBGaWxlKSB7Ci0JCQkJcmV0dXJuICgoTWFwRmlsZSllbGVtZW50KS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJfQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWFwRmlsZSkgewotCQkJCXJldHVybiBwcm92aWRlci5nZXRJbWFnZSgoKE1hcEZpbGUpZWxlbWVudCkuZ2V0RmlsZSgpKTsKLQkJCX0KLQkJCXJldHVybiBwcm92aWRlci5nZXRJbWFnZShlbGVtZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJcHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBQcm9qZWN0U2VsZWN0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUsIAotCQkJU3RyaW5nIHRpdGxlLCAKLQkJCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncywgCi0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2UpIHsKLQkJc3VwZXIocGFnZU5hbWUsIHRpdGxlLCBpbWFnZSk7Ci0JCXRoaXMuc2V0dGluZ3MgPSBzZXR0aW5nczsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCQkKLQkJQ29tcG9zaXRlIHRvcENvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRvcENvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXRvcENvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRvcENvbnRhaW5lciwgU1dULkhPUklaT05UQUwpOwotCQlsYWJlbC5zZXRGb250KGZvbnQpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUHJvamVjdFNlbGVjdGlvblBhZ2UuMiIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJdmlld2VyID0gbmV3IENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyKHRvcENvbnRhaW5lciwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludD0gdmlld2VyLmdldFRyZWUoKS5nZXRJdGVtSGVpZ2h0KCkgKiAxNTsKLQkJdmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdmlld2VyLmdldFRyZWUoKS5zZXRGb250KGZvbnQpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTWFwRmlsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZ2V0Q29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0SW5wdXQobWFwUHJvamVjdCk7Ci0JCXZpZXdlci5leHBhbmRBbGwoKTsKLQkJdmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZVBhZ2VDb21wbGV0ZSgpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCQotCQljb21wYXJlQnV0dG9uID0gbmV3IEJ1dHRvbih0b3BDb250YWluZXIsU1dULkNIRUNLKTsKLQkJY29tcGFyZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUHJvamVjdFNlbGVjdGlvblBhZ2UuMyIpKTsgLy8kTk9OLU5MUy0xJAotCQljb21wYXJlQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0JCWNvbXBhcmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY29tcGFyZUJ1dHRvbkNoZWNrZWQgPSBjb21wYXJlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQkJCi0JCWluaXRpYWxpemUoKTsKLQkJc2V0Q29udHJvbCh0b3BDb250YWluZXIpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgdmlld2VyCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1hcFByb2plY3QpIHsKLQkJCQkJcmV0dXJuIG1hcFByb2plY3QuZ2V0VmFsaWRNYXBGaWxlcygpOwkJCQkJCQkJCi0JCQkJfQotCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWFwRmlsZSkgewotCQkJCQlyZXR1cm4gKChNYXBGaWxlKXBhcmVudEVsZW1lbnQpLmdldEFjY2Vzc2libGVQcm9qZWN0cygpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1hcEZpbGUpIHsKLQkJCQkJcmV0dXJuICgoTWFwRmlsZSllbGVtZW50KS5nZXRBY2Nlc3NpYmxlUHJvamVjdHMoKS5sZW5ndGggPiAwOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGNoZWNrZWQgaXRlbXMgaWYgdGhleSBhcmUgSVByb2plY3QgCi0JICovCi0JcHVibGljIElQcm9qZWN0W10gZ2V0Q2hlY2tlZFByb2plY3RzKCl7Ci0JCUFycmF5TGlzdCBwcm9qZWN0c1RvUmVsZWFzZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0W10gb2JqID0gdmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlpZiAob2JqID09IG51bGwpcmV0dXJuIG51bGw7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspewotCQkJaWYgKG9ialtpXSBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJCXByb2plY3RzVG9SZWxlYXNlLmFkZChvYmpbaV0pOyAKLQkJfQotCQlyZXR1cm4gKElQcm9qZWN0W10pcHJvamVjdHNUb1JlbGVhc2UudG9BcnJheShuZXcgSVByb2plY3RbcHJvamVjdHNUb1JlbGVhc2Uuc2l6ZSgpXSk7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVhZFByb2plY3RTZXR0aW5ncygpewotCQlpZiggc2V0dGluZ3MgPT0gbnVsbCkgcmV0dXJuOwotCQlpZihzZXR0aW5ncy5nZXRBcnJheShTRUxFQ1RFRF9JVEVNU19LRVkpICE9IG51bGwpewotCQkJQXJyYXlMaXN0IG5hbWVMaXN0ID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHNldHRpbmdzLmdldEFycmF5KFNFTEVDVEVEX0lURU1TX0tFWSkpKTsKLQkJCWlmKG5hbWVMaXN0ICE9IG51bGwpewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBuYW1lTGlzdC5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKXsKLQkJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdFdpdGhOYW1lKG5hbWUpOwotCQkJCQlpZihwcm9qZWN0ICE9IG51bGwpewotCQkJCQkJdmlld2VyLnNldENoZWNrZWQocHJvamVjdCx0cnVlKTsKLQkJCQkJfQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0Q29tcGFyZUVuYWJsZW1lbnQoKXsKLQkJaWYoIHNldHRpbmdzID09IG51bGwgfHwgc2V0dGluZ3MuZ2V0KENPTVBBUkVfQlVUVE9OX0tFWSkgPT0gbnVsbCkgewotCQkJY29tcGFyZUJ1dHRvbi5zZXRTZWxlY3Rpb24oIHRydWUpOwotCQkJY29tcGFyZUJ1dHRvbkNoZWNrZWQgPSB0cnVlOwotCQkJcmV0dXJuOwotCQl9ZWxzZXsKLQkJCWJvb2xlYW4gYiA9IHNldHRpbmdzLmdldEJvb2xlYW4oQ09NUEFSRV9CVVRUT05fS0VZKTsKLQkJCWNvbXBhcmVCdXR0b24uc2V0U2VsZWN0aW9uKGIpOwotCQkJY29tcGFyZUJ1dHRvbkNoZWNrZWQgPSBiOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgdGhlIGNoZWNrZWQgaXRlbXMgYW5kIHRoZSBjaGVja2JveCBvcHRpb25zIHRvIGRpYWxvZyBzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVTZXR0aW5ncygpewotCQlPYmplY3RbXSBvYmogPSB2aWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCUFycmF5TGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspewotCQkJaWYob2JqW2ldIGluc3RhbmNlb2YgSVByb2plY3QpewotCQkJCW5hbWVzLmFkZCgoKElQcm9qZWN0KW9ialtpXSkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlzZXR0aW5ncy5wdXQoU0VMRUNURURfSVRFTVNfS0VZLCAoU3RyaW5nW10pbmFtZXMudG9BcnJheShuZXcgU3RyaW5nW25hbWVzLnNpemUoKV0pKTsKLQkJc2V0dGluZ3MucHV0KENPTVBBUkVfQlVUVE9OX0tFWSwgY29tcGFyZUJ1dHRvbkNoZWNrZWQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpewotCQlpbml0Q2hlY2tlZFByb2plY3RzKCk7Ci0JCWluaXRDb21wYXJlRW5hYmxlbWVudCgpOwotCQl1cGRhdGVQYWdlQ29tcGxldGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRDaGVja2VkUHJvamVjdHMoKXsKLQkJSVByb2plY3RbXSBwID0gKChSZWxlYXNlV2l6YXJkKWdldFdpemFyZCgpKS5nZXRQcmVTZWxlY3RlZFByb2plY3RzKCApOwotCQlpZihwICE9IG51bGwpewotCQkJdmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhwKTsKLQkJfWVsc2V7Ci0JCQlyZWFkUHJvamVjdFNldHRpbmdzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgPGNvZGU+cmVhZFNldHRpbmdzKCk8Y29kZT4gdG8gcmV0dXJuIHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotCSAqLwotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdFdpdGhOYW1lKFN0cmluZyBuYW1lKXsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChuYW1lKTsKLQkJaWYocHJvamVjdC5leGlzdHMoKSAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGFyZUJ1dHRvbkNoZWNrZWQoKXsKLQkJcmV0dXJuIGNvbXBhcmVCdXR0b25DaGVja2VkOwotCX0KLQkKLQkvKioKLQkgKlRoaXMgcGFnZSB3aWxsIG5vdCBjb21wbGV0ZSB1bnRpbCBhdCBsZWFzdCBvbmUgcHJvamVjdCBpcyBjaGVja2VkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhZ2VDb21wbGV0ZSgpewotCQlPYmplY3RbXSBvYmogPSB2aWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCWlmKG9iai5sZW5ndGggPiAwKXsKLQkJCWZvcihpbnQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspewotCQkJCS8vRXhjbHVkZSB0aGUgc2l0dWF0aW9uIHRoYXQgYW4gZW1wdHkgc2hvd24gbWFwIGZpbGUgaXMgc2VsZWN0ZWQKLQkJCQlpZihvYmpbaV0gaW5zdGFuY2VvZiBJUHJvamVjdCl7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2V7Ci0JCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyIGdldFZpZXdlcigpewotCQlyZXR1cm4gdmlld2VyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVByb2plY3RbXSBwcm9qZWN0cykgewotCQlpZihwcm9qZWN0cyAhPSBudWxsICYmIHByb2plY3RzLmxlbmd0aCA+IDApewotCQkJZ2V0Vmlld2VyKCkuc2V0Q2hlY2tlZEVsZW1lbnRzKHByb2plY3RzKTsJCi0JCX0KLQl9Ci0JcHVibGljIHZvaWQgdXBkYXRlTWFwUHJvamVjdChNYXBQcm9qZWN0IG0pewotCQltYXBQcm9qZWN0ID0gbTsKLQkJaWYodmlld2VyICE9IG51bGwpewotCQkJdmlld2VyLnNldElucHV0KG1hcFByb2plY3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9Qcm9qZWN0VmFsaWRhdGlvbkRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9Qcm9qZWN0VmFsaWRhdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWI4OWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvUHJvamVjdFZhbGlkYXRpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29tcGFyZS5Db21wYXJlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uY29yZS5UZWFtRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLkNWU0NvbXBhcmVTdWJzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLkNWU1RhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkuc3Vic2NyaWJlci5Db21wYXJlUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS51aS5TYXZlYWJsZVBhcnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0udWkuc3luY2hyb25pemUuSVN5bmNocm9uaXplUGFnZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS51aS5zeW5jaHJvbml6ZS5JU3luY2hyb25pemVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLnVpLnN5bmNocm9uaXplLlBhcnRpY2lwYW50UGFnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLnVpLnN5bmNocm9uaXplLlBhcnRpY2lwYW50UGFnZVNhdmVhYmxlUGFydDsKLQotLyoqCi0gKkl0IGV4dGVuZHMgPGNvZGU+RGlhbG9nPGNvZGU+LiBUaGlzIGRpYWxvZyB3aWxsIHNob3cgdXAgaWYgPGNvZGU+aXNWYWxpZGF0ZUJ1dHRvblNlbGVjdGVkKCk8Y29kZT4gCi0gKmluIDxjb2RlPlRhZ1BhZ2U8Y29kZT4gcmV0dXJucyB0cnVlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VmFsaWRhdGlvbkRpYWxvZyBleHRlbmRzIFBhcnRpY2lwYW50UGFnZURpYWxvZyB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIlByb2plY3RWYWxpZGF0aW9uRGlhbG9nLjIiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVJlbGVhc2UoZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIElQcm9qZWN0W10gcCwgZmluYWwgQ1ZTVGFnW10gdGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgVGVhbUV4Y2VwdGlvbnsKLQkJZmluYWwgQ29tcGFyZVBhcnRpY2lwYW50IHBhcnRpY2lwYW50ID0gbmV3IENvbXBhcmVQYXJ0aWNpcGFudChuZXcgQ1ZTQ29tcGFyZVN1YnNjcmliZXIocCwgdGFncywgTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZWxlYXNlV2l6YXJkLjIwIikpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcGFydGljaXBhbnQucmVmcmVzaE5vdyhwLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbGVhc2VXaXphcmQuMjAiKSwgbW9uaXRvcik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghcGFydGljaXBhbnQuZ2V0U3luY0luZm9TZXQoKS5pc0VtcHR5KCkpIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCW9wZW5WYWxpZGF0aW9uRmFpbGVkRGlhbG9nKHNoZWxsLCBwYXJ0aWNpcGFudCk7Ci0JCQkJCX0KLQkJCQl9KTsJCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlwYXJ0aWNpcGFudC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG9wZW5WYWxpZGF0aW9uRmFpbGVkRGlhbG9nKFNoZWxsIHNoZWxsLCBDb21wYXJlUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQkJSVN5bmNocm9uaXplUGFnZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHBhcnRpY2lwYW50LmNyZWF0ZVBhZ2VDb25maWd1cmF0aW9uKCk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0TWVudUdyb3VwcyhJU3luY2hyb25pemVQYWdlQ29uZmlndXJhdGlvbi5QX1RPT0xCQVJfTUVOVSwgbmV3IFN0cmluZ1tdIHsgCi0JCQkJSVN5bmNocm9uaXplUGFnZUNvbmZpZ3VyYXRpb24uTkFWSUdBVEVfR1JPVVAsICAKLQkJCQlJU3luY2hyb25pemVQYWdlQ29uZmlndXJhdGlvbi5MQVlPVVRfR1JPVVAgfSk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0TWVudUdyb3VwcyhJU3luY2hyb25pemVQYWdlQ29uZmlndXJhdGlvbi5QX0NPTlRFWFRfTUVOVSwgbmV3IFN0cmluZ1swXSk7Ci0JCQotCQlDb21wYXJlQ29uZmlndXJhdGlvbiBjYyA9IG5ldyBDb21wYXJlQ29uZmlndXJhdGlvbigpOwotCQljYy5zZXRMZWZ0RWRpdGFibGUoZmFsc2UpOwotCQljYy5zZXRSaWdodEVkaXRhYmxlKGZhbHNlKTsKLQkJUGFydGljaXBhbnRQYWdlU2F2ZWFibGVQYXJ0IHBhcnQgPSBuZXcgUGFydGljaXBhbnRQYWdlU2F2ZWFibGVQYXJ0KHNoZWxsLCBjYywgY29uZmlndXJhdGlvbiwgcGFydGljaXBhbnQpOwotCQkKLQkJUHJvamVjdFZhbGlkYXRpb25EaWFsb2cgZGlhbG9nID0gbmV3IFByb2plY3RWYWxpZGF0aW9uRGlhbG9nKHNoZWxsLCBwYXJ0LCBwYXJ0aWNpcGFudCk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQlwdWJsaWMgUHJvamVjdFZhbGlkYXRpb25EaWFsb2coU2hlbGwgc2hlbGwsIFNhdmVhYmxlUGFydEFkYXB0ZXIgaW5wdXQsCi0JCQlJU3luY2hyb25pemVQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgewotCQlzdXBlcihzaGVsbCwgaW5wdXQsIHBhcnRpY2lwYW50KTsKLQkJc2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9Qcm9wZXJ0aWVzRmlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9Qcm9wZXJ0aWVzRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTExOWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvUHJvcGVydGllc0ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5yZWxlbmcudG9vbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotLyoqCi0gKiBAYXV0aG9yIGRyb2JlcnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzRmlsZSBleHRlbmRzIFNvdXJjZUZpbGUgewotCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKi8KLQlwdWJsaWMgUHJvcGVydGllc0ZpbGUoSUZpbGUgZmlsZSkgewotCQlzdXBlcihmaWxlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBUZXN0LnBvcHVwLmFjdGlvbnMuU291cmNlRmlsZSNnZXRDb21tZW50U3RhcnQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudFN0YXJ0KCkgewotCQlyZXR1cm4gIiMjIjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBUZXN0LnBvcHVwLmFjdGlvbnMuU291cmNlRmlsZSNnZXRDb21tZW50RW5kKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnRFbmQoKSB7Ci0JCXJldHVybiAiIyMiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9SZWxFbmdQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvUmVsRW5nUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNjZhOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9SZWxFbmdQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5yZWxlbmcudG9vbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIEEgUGx1Z2luIGZvciBwZXJmb3JtaW5nIGNlcnRhaW4gaW1wb3J0YW50IFJlbEVuZyB0YXNrcy4KLSAqIEN1cnJlbnRsZXkgdGhpcyBQbHVnaW4gcHJvdmlkZXMgc3VwcG9ydCBmb3I6Ci0gKiAgICBSZWxFbmcgTWFwIEZpbGUgVmFsaWRhdG9yIEJ1aWxkZXIgYW5kIGFzc29jaWF0ZWQgcHJvamVjdCBuYXR1cmUKLSAqLwotcHVibGljIGNsYXNzIFJlbEVuZ1BsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLnJlbGVuZy50b29scyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfUFJPSkVDVF9OQU1FID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZWxFbmdQbHVnaW4uMSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQX0ZPTERFUiA9IE1lc3NhZ2VzLmdldFN0cmluZygiUmVsRW5nUGx1Z2luLjIiKTsgLy8kTk9OLU5MUy0xJAotCQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBSZWxFbmdQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBSZWxFbmdQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlzdXBlcihkZXNjcmlwdG9yKTsKLQkJcGx1Z2luID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoSUQgKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbEVuZ1BsdWdpbi4zIikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZWxFbmdQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZT0gUmVsRW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgbG9nZ2luZyBDb3JlRXhjZXB0aW9ucyB0byB0aGUgcGx1Z2luIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCWxvZyhlLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCksIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBnaXZlbiBleGNlcHRpb24gYWxvbmcgd2l0aCB0aGUgcHJvdmlkZWQgbWVzc2FnZSBhbmQgc2V2ZXJpdHkgaW5kaWNhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgSUQsIDAsIG1lc3NhZ2UsIGUpKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBnaXZlbiBzdGF0dXMuIERvIG5vdCB1c2UgdGhpcyBtZXRob2QgZm9yIHRoZSBJU3RhdHVzIGZyb20gYSBDb3JlRXhjZXB0aW9uLgotCSAqIFVzZTxjb2RlPmxvZyhDb3JlRXhjZXB0aW9uKTwvY29kZT4gaW5zdGVhZCBzbyB0aGUgc3RhY2sgdHJhY2UgaXMgbm90IGxvc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlnZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIHBsdWctaW4gaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgcGx1Z2luIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBSZWxFbmdQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQkvLyBJZiB0aGUgaW5zdGFuY2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLCB3ZSB3aWxsIHdhaXQuCi0JCS8vIFRoaXMgY2FuIG9jY3VyIGlmIG11bHRpcGxlIHRocmVhZHMgdHJ5IHRvIGxvYWQgdGhlIHBsdWdpbiBhdCB0aGUgc2FtZQotCQkvLyB0aW1lIChzZWUgYnVnIDMzODI1OiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzgyNSkKLQkJd2hpbGUgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCg1MCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlIGFuZCBrZWVwIHRyeWluZwotCQkJfQotCQl9Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCS8qKgotCSAqIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBhIHNhbXBsZSBvZiBob3cgdG8gYXNzaWduIGEKLQkgKiBSZWxFbmcgbmF0dXJlIHRvIGEgcHJvamVjdC4gIFRoaXMgb25seSBldmVyIG5lZWRlZAotCSAqIHRvIGJlIGRvbmUgb25jZSB0byBzZXQgdXAgb3JnLmVjbGlwc2UucmVsZW5nIHByb2plY3QKLQkgKiB3aXRoIHRoZSBkZXNpcmVkIG5hdHVyZQotCSAqLwotLy8JcHJpdmF0ZSB2b2lkIGFzc2lnbk5hdHVyZSgpIHsKLS8vCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLS8vCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gd29ya3NwYWNlLmdldFJvb3QoKTsKLS8vCQlJUHJvamVjdCBhUHJvamVjdCA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdCgpOwotLy8JCQotLy8JCQotLy8JCXRyeSB7Ci0vLwkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb247Ci0vLwkJCWRlc2NyaXB0aW9uID0gYVByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLS8vCQkJU3RyaW5nW10gbmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotLy8JCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1tuYXR1cmVzLmxlbmd0aCArIDFdOwotLy8JCQlTeXN0ZW0uYXJyYXljb3B5KG5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIG5hdHVyZXMubGVuZ3RoKTsKLS8vCQkJbmV3TmF0dXJlc1tuYXR1cmVzLmxlbmd0aF0gPSAib3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzLnJlbEVuZ05hdHVyZSI7Ci0vLwkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLS8vCQkJYVByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotLy8JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWxlZCB0byBzZXQgbmF0dXJlIik7Ci0vLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfQotLy8JCQotLy8JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9SZWxlYXNlV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL1JlbGVhc2VXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRkZGJhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL1JlbGVhc2VXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnJlbGVuZy50b29sczsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5jb3JlLlRlYW1FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuQ1ZTVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwudWkuSVRlYW1VSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLnVpLlRlYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLnVpLmRpYWxvZ3MuSVByb21wdENvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLnVpLmRpYWxvZ3MuUHJvbXB0aW5nRGlhbG9nOwotCi0KLXB1YmxpYyBjbGFzcyBSZWxlYXNlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsKLQotCXByaXZhdGUgTWFwUHJvamVjdFNlbGVjdGlvblBhZ2UgbWFwU2VsZWN0aW9uUGFnZTsKLQlwcml2YXRlIFByb2plY3RTZWxlY3Rpb25QYWdlIHByb2plY3RTZWxlY3Rpb25QYWdlOwotCXByaXZhdGUgVGFnUGFnZSB0YWdQYWdlOwotCXByaXZhdGUgUHJvamVjdENvbXBhcmVQYWdlIHByb2plY3RDb21wYXJlUGFnZTsKLQlwcml2YXRlIE1hcEZpbGVDb21wYXJlUGFnZSBtYXBDb21wYXJlUGFnZTsKLQlwcml2YXRlIENvbW1pdENvbW1lbnRQYWdlIGNvbW1lbnRQYWdlOwotCi0JcHJpdmF0ZSBEaWFsb2cgcGFyZW50RGlhbG9nOwotCXByaXZhdGUgSURpYWxvZ1NldHRpbmdzIHNlY3Rpb247Ci0JCi0JcHJpdmF0ZSBNYXBQcm9qZWN0IG1hcFByb2plY3Q7Ci0JcHJpdmF0ZSBJUHJvamVjdFtdIHByZVNlbGVjdGVkUHJvamVjdHM7Ci0JcHJpdmF0ZSBJUHJvamVjdFtdIHNlbGVjdGVkUHJvamVjdHM7Ci0JCi0KLQlwdWJsaWMgUmVsZWFzZVdpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoIlJlbGVhc2UiKTsgLy8kTk9OLU5MUy0xJAotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBSZWxFbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCXNlY3Rpb24gPSBzZXR0aW5ncy5nZXRTZWN0aW9uKCJSZWxlYXNlV2l6YXJkIik7Ly8kTk9OLU5MUy0xJAotCQlpZiAoc2VjdGlvbiA9PSBudWxsKSB7Ci0JCQlzZWN0aW9uID0gc2V0dGluZ3MuYWRkTmV3U2VjdGlvbigiUmVsZWFzZVdpemFyZCIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlzZXREaWFsb2dTZXR0aW5ncyhzZWN0aW9uKTsKLQl9CQotCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTaGVsbCBzaGVsbCkgewotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHRoaXMpOwotCQlzZXRQYXJlbnREaWFsb2coZGlhbG9nKTsKLQkJcmV0dXJuIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQltYXBTZWxlY3Rpb25QYWdlID0gbmV3IE1hcFByb2plY3RTZWxlY3Rpb25QYWdlKCJNYXBQcm9qZWN0U2VsZWN0aW9uUGFnZSIsCi0JCQkJIk1hcCBQcm9qZWN0IFNlbGVjdGlvbiIsCi0JCQkJc2VjdGlvbiwKLQkJCQlUZWFtVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKElUZWFtVUlJbWFnZXMuSU1HX1dJWkJBTl9TSEFSRSkpOwotCQltYXBTZWxlY3Rpb25QYWdlLnNldERlc2NyaXB0aW9uKCJTcGVjaWZ5IGEgbWFwIHByb2plY3QgdG8gcmVsZWFzZSBwcm9qZWN0cyIpOwotCQlhZGRQYWdlKG1hcFNlbGVjdGlvblBhZ2UpOwotCQkKLQkJcHJvamVjdFNlbGVjdGlvblBhZ2UgPSBuZXcgUHJvamVjdFNlbGVjdGlvblBhZ2UoTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZWxlYXNlV2l6YXJkLjUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiUmVsZWFzZVdpemFyZC42IiksIAotCQkJCXNlY3Rpb24sIAotCQkJCVRlYW1VSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoSVRlYW1VSUltYWdlcy5JTUdfV0laQkFOX1NIQVJFKSk7Ci0JCXByb2plY3RTZWxlY3Rpb25QYWdlLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiUmVsZWFzZVdpemFyZC43IikpOyAvLyROT04tTkxTLTEkCi0JCWFkZFBhZ2UocHJvamVjdFNlbGVjdGlvblBhZ2UpOwotCQkKLQkJdGFnUGFnZSA9IG5ldyBUYWdQYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiUmVsZWFzZVdpemFyZC44IiksIAotCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiUmVsZWFzZVdpemFyZC45IiksIAotCQkJCXNlY3Rpb24sIAotCQkJCVRlYW1VSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoSVRlYW1VSUltYWdlcy5JTUdfV0laQkFOX1NIQVJFKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0YWdQYWdlLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiUmVsZWFzZVdpemFyZC4xMCIpKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRQYWdlKHRhZ1BhZ2UpOwotCQkKLQkJcHJvamVjdENvbXBhcmVQYWdlID0gbmV3IFByb2plY3RDb21wYXJlUGFnZShNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbGVhc2VXaXphcmQuMTEiKSwgLy8kTk9OLU5MUy0xJAotCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiUmVsZWFzZVdpemFyZC4xMiIpLCAKLQkJCQlUZWFtVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKElUZWFtVUlJbWFnZXMuSU1HX1dJWkJBTl9TSEFSRSkpOyAvLyROT04tTkxTLTEkCi0JCXByb2plY3RDb21wYXJlUGFnZS5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbGVhc2VXaXphcmQuMTMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkUGFnZShwcm9qZWN0Q29tcGFyZVBhZ2UpOwotCQkKLQkJbWFwQ29tcGFyZVBhZ2UgPSBuZXcgTWFwRmlsZUNvbXBhcmVQYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiUmVsZWFzZVdpemFyZC4xNCIpLCAvLyROT04tTkxTLTEkCi0JCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZWxlYXNlV2l6YXJkLjE1IiksIAotCQkJCVRlYW1VSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoSVRlYW1VSUltYWdlcy5JTUdfV0laQkFOX1NIQVJFKSk7IC8vJE5PTi1OTFMtMSQKLQkJbWFwQ29tcGFyZVBhZ2Uuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZWxlYXNlV2l6YXJkLjE2IikpOyAvLyROT04tTkxTLTEkCi0JCWFkZFBhZ2UobWFwQ29tcGFyZVBhZ2UpOwotCQkKLQkJY29tbWVudFBhZ2UgPSBuZXcgQ29tbWl0Q29tbWVudFBhZ2UocGFyZW50RGlhbG9nLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbGVhc2VXaXphcmQuMTciKSwgLy8kTk9OLU5MUy0xJAotCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiUmVsZWFzZVdpemFyZC4xOCIpLCBUZWFtVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKElUZWFtVUlJbWFnZXMuSU1HX1dJWkJBTl9TSEFSRSksIE1lc3NhZ2VzLmdldFN0cmluZygiUmVsZWFzZVdpemFyZC4xOSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFkZFBhZ2UoY29tbWVudFBhZ2UpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYoIWlzUHJvamVjdFNlbGVjdGVkKCkpcmV0dXJuIGZhbHNlOwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCUNWU1RhZyB0YWcgPSBuZXcgQ1ZTVGFnKHRhZ1BhZ2UuZ2V0VGFnU3RyaW5nKCksIENWU1RhZy5WRVJTSU9OKTsKLQkJCQkJVGFnQW5kUmVsZWFzZU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgVGFnQW5kUmVsZWFzZU9wZXJhdGlvbihnZXRTaGVsbCgpLCBtYXBQcm9qZWN0LCAKLQkJCQkJCQlzZWxlY3RlZFByb2plY3RzLCB0YWcsY29tbWVudFBhZ2UuZ2V0Q29tbWVudCgpICk7Ci0JCQkJCWlmICh0YWdQYWdlLmlzTW92ZUJ1dHRvblNlbGVjdGVkKCkpIHsKLQkJCQkJCW9wZXJhdGlvbi5tb3ZlVGFnKCk7Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci5iZWdpblRhc2soIlJlbGVhc2luZyIsIDEwMCk7Ci0JCQkJCW9wZXJhdGlvbi5ydW4obmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA5MCkpOwotCQkJCQl0cnkgewkJCQkJCQotCQkJCQkJaWYodGFnUGFnZS5pc1ZhbGlkYXRlQnV0dG9uU2VsZWN0ZWQoKSl7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJdmFsaWRhdGVSZWxlYXNlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTApKTsKLQkJCQkJCQl9IGNhdGNoIChUZWFtRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCW1hcFNlbGVjdGlvblBhZ2Uuc2F2ZVNldHRpbmdzKCk7Ci0JCQlwcm9qZWN0U2VsZWN0aW9uUGFnZS5zYXZlU2V0dGluZ3MoKTsKLQkJCXRhZ1BhZ2Uuc2F2ZVNldHRpbmdzKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gQ2FuY2VsbGVkLiBJZ25vcmUgYW5kIGNsb3NlIGRpYWxvZwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJQ1ZTVUlQbHVnaW4ub3BlbkVycm9yKGdldFNoZWxsKCksIG51bGwsIG51bGwsIGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGFyZW50RGlhbG9nKERpYWxvZyBwKSB7Ci0JCXRoaXMucGFyZW50RGlhbG9nID0gcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldE5leHRQYWdlKG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlpZiAocGFnZSA9PSBtYXBTZWxlY3Rpb25QYWdlKXsKLQkJCXJldHVybiBwcm9qZWN0U2VsZWN0aW9uUGFnZTsKLQkJfQotCQlpZiAocGFnZSA9PSBwcm9qZWN0U2VsZWN0aW9uUGFnZSkgewotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHByb2plY3RTZWxlY3Rpb25QYWdlLmdldENoZWNrZWRQcm9qZWN0cygpOwotCQkJaWYgKHByb2plY3RzICE9IG51bGwgJiYgcHJvamVjdHMubGVuZ3RoID4gMCl7Ci0JCQkJc2VsZWN0ZWRQcm9qZWN0cyA9IHByb2plY3RzOwotCQkJfQotCi0JCQlpZiAocHJvamVjdFNlbGVjdGlvblBhZ2UuaXNDb21wYXJlQnV0dG9uQ2hlY2tlZCgpKXsKLQkJCQlyZXR1cm4gcHJvamVjdENvbXBhcmVQYWdlOwotCQkJfQkJCQotCQkJZWxzZQotCQkJCXJldHVybiB0YWdQYWdlOwotCQl9Ci0JCWlmIChwYWdlID09IHRhZ1BhZ2UpIHsKLQkJCWlmICh0YWdQYWdlLmNvbXBhcmVCdXR0b25TZWxlY3RlZCgpKXsKLQkJCQltYXBDb21wYXJlUGFnZS5zZXRUYWcodGFnUGFnZS5nZXRUYWdTdHJpbmcoKSk7Ci0JCQkJcmV0dXJuIG1hcENvbXBhcmVQYWdlOwotCQkJfQotCQkJaWYgKHRhZ1BhZ2UuY29tbWl0QnV0dG9uU2VsZWN0ZWQoKSkKLQkJCQlyZXR1cm4gY29tbWVudFBhZ2U7Ci0JCX0KLQkJaWYgKHBhZ2UgPT0gbWFwQ29tcGFyZVBhZ2UpCi0JCQlyZXR1cm4gY29tbWVudFBhZ2U7Ci0JCWlmIChwYWdlID09IHByb2plY3RDb21wYXJlUGFnZSkKLQkJCXJldHVybiB0YWdQYWdlOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmVTZWxlY3RlZFByb2plY3RzKElSZXNvdXJjZVtdIHJlc291cmNlcykgewotCQlpZiAocmVzb3VyY2VzLmxlbmd0aCA8IDEpIHsKLQkJCXByZVNlbGVjdGVkUHJvamVjdHMgPSBudWxsOwotCQl9IGVsc2UgewotCQkJU2V0IGxpc3QgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlsaXN0LmFkZChyZXNvdXJjZXNbaV0uZ2V0UHJvamVjdCgpKTsKLQkJCX0KLQkJCXByZVNlbGVjdGVkUHJvamVjdHMgPSAoSVByb2plY3RbXSkgbGlzdC50b0FycmF5KG5ldyBJUHJvamVjdFtsaXN0LnNpemUoKV0pOwotCQl9Ci0JfQotCi0JLy8gUHJvbXB0IGZvciBhbnkgdW5jb21taXR0ZWQgY2hhbmdlcwotCXByb3RlY3RlZCBJUHJvamVjdFtdIHBlcmZvcm1Qcm9tcHRpbmcoSVByb2plY3RbXSBwcm9qZWN0cykgIHsKLQkJSVJlc291cmNlW10gcmVzb3VyY2VzOwotCQlQcm9tcHRpbmdEaWFsb2cgcHJvbXB0ID0gbmV3IFByb21wdGluZ0RpYWxvZyhnZXRTaGVsbCgpLCBwcm9qZWN0cywKLQkJCWdldFByb21wdENvbmRpdGlvbihwcm9qZWN0cyksIFBvbGljeS5iaW5kKCJUYWdBY3Rpb24udW5jb21taXR0ZWRDaGFuZ2VzVGl0bGUiKSk7Ly8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJIHJlc291cmNlcyA9IHByb21wdC5wcm9tcHRGb3JNdWx0aXBsZSgpOwotCQl9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmKHJlc291cmNlcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIG51bGw7CQkJCQkKLQkJfQotCQlwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtyZXNvdXJjZXMubGVuZ3RoIF07Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspewotCQkJaWYocmVzb3VyY2VzW2ldIGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQkJcHJvamVjdHNbaV0gPSAoSVByb2plY3QpcmVzb3VyY2VzW2ldOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0czsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgSVByb21wdENvbmRpdGlvbiBnZXRQcm9tcHRDb25kaXRpb24oSVJlc291cmNlW10gcmVzb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBJUHJvbXB0Q29uZGl0aW9uKCkgewotCQkJcHVibGljIGJvb2xlYW4gbmVlZHNQcm9tcHQoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJcmV0dXJuIENWU0xpZ2h0d2VpZ2h0RGVjb3JhdG9yLmlzRGlydHkocmVzb3VyY2UpOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBwcm9tcHRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJCXJldHVybiBQb2xpY3kuYmluZCgiVGFnQWN0aW9uLnVuY29tbWl0dGVkQ2hhbmdlcyIsIHJlc291cmNlLmdldE5hbWUoKSk7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBJUHJvamVjdFtdIGdldFNlbGVjdGVkUHJvamVjdHMoKXsKLQkJcmV0dXJuIHNlbGVjdGVkUHJvamVjdHM7Ci0JfQotCi0JLy90aGUgdXBkYXRlIHdpbGwgaGFwcGVuIHdoZW4gKDEpZnJvbSBwcm9qZWN0IHNlbGVjdGlvbiBwYWdlIHRvIGNvbXBhcmUgcHJvamVjdCBwYWdlIG9yICgyKWZyb20KLQkvL3Byb2plY3Qgc2VsZWN0aW9uIHBhZ2UgdG8gRW50ZXIgVGFnIHBhZ2UuIEl0IGNhbGxzIHNob3VsZFJlbW92ZSgpIHRvIGRldGVybWluZSB0aGUgcHJvamVjdHMgdG8ga2VlcAotCXB1YmxpYyB2b2lkIHVwZGF0ZVNlbGVjdGVkUHJvamVjdCgpewotCQlzZWxlY3RlZFByb2plY3RzID0gcHJvamVjdFNlbGVjdGlvblBhZ2UuZ2V0Q2hlY2tlZFByb2plY3RzKCk7Ci0JCXNlbGVjdGVkUHJvamVjdHMgPSBwZXJmb3JtUHJvbXB0aW5nKHNlbGVjdGVkUHJvamVjdHMpOwotCQlwcm9qZWN0U2VsZWN0aW9uUGFnZS5zZXRTZWxlY3Rpb24oc2VsZWN0ZWRQcm9qZWN0cyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkUHJvamVjdHMoSVJlc291cmNlW10gcHJvamVjdHMpewotCQlpZihwcm9qZWN0cyA9PSBudWxsKSBzZWxlY3RlZFByb2plY3RzID0gbnVsbDsKLQkJZWxzZSB7Ci0JCQlzZWxlY3RlZFByb2plY3RzID0gIG5ldyBJUHJvamVjdFtwcm9qZWN0cy5sZW5ndGhdOwotCQkJZm9yKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKXsKLQkJCQlzZWxlY3RlZFByb2plY3RzW2ldID0gKElQcm9qZWN0KXByb2plY3RzW2ldOwotCQkJfQotCQl9Ci0JfQotCXByb3RlY3RlZCBQcm9qZWN0U2VsZWN0aW9uUGFnZSBnZXRQcm9qZWN0U2VsZWN0aW9uUGFnZSgpewotCQlyZXR1cm4gcHJvamVjdFNlbGVjdGlvblBhZ2U7Ci0JfQotCQotCS8vVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIHZhbGlkYXRlIGJ1dHRvbiBpbiBUYWdQYWdlIGlzIGNoZWNrZWQKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVSZWxlYXNlKElQcm9ncmVzc01vbml0b3IgIG1vbml0b3IpIHRocm93cyBUZWFtRXhjZXB0aW9uewotCQlQcm9qZWN0VmFsaWRhdGlvbkRpYWxvZy52YWxpZGF0ZVJlbGVhc2UoZ2V0U2hlbGwoKSwgc2VsZWN0ZWRQcm9qZWN0cywgbWFwUHJvamVjdC5nZXRUYWdzRm9yKHNlbGVjdGVkUHJvamVjdHMpLCBtb25pdG9yKTsKLQl9Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1Byb2plY3RTZWxlY3RlZCgpewotCQlpZiAoc2VsZWN0ZWRQcm9qZWN0cyA9PSBudWxsIHx8IHNlbGVjdGVkUHJvamVjdHMubGVuZ3RoID09IDApewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3RbXSBnZXRQcmVTZWxlY3RlZFByb2plY3RzKCl7Ci0JCXJldHVybiBwcmVTZWxlY3RlZFByb2plY3RzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJLy8gVGhlcmUgbXVzdCBiZSBwcm9qZWN0cyBzZWxlY3RlZAotCQlpZiAoIWlzUHJvamVjdFNlbGVjdGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBUaGVyZSBtdXN0IGJlIGEgdGFnCi0JCWlmICghdGFnUGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gRm9yY2UgbWFwIGNvbXBhcmlzb24gaWYgb3B0aW9uIHNldCBieSB1c2VyCi0JCUlXaXphcmRQYWdlIGN1cnJlbnRQYWdlID0gZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKTsKLQkJaWYoY3VycmVudFBhZ2UgPT0gdGFnUGFnZSl7Ci0JCQlpZih0YWdQYWdlLmNvbXBhcmVCdXR0b25TZWxlY3RlZCgpKXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIE1hcFByb2plY3QgZ2V0TWFwUHJvamVjdCgpewotCQlyZXR1cm4gbWFwUHJvamVjdDsKLQl9Ci0JcHVibGljIHZvaWQgYm9hZGNhc3RNYXBQcm9qZWN0Q2hhbmdlKE1hcFByb2plY3QgbSl7Ci0JCW1hcFByb2plY3QgPSBtOwotCQlwcm9qZWN0U2VsZWN0aW9uUGFnZS51cGRhdGVNYXBQcm9qZWN0KG0pOwotCQlwcm9qZWN0Q29tcGFyZVBhZ2UudXBkYXRlTWFwUHJvamVjdChtKTsKLQkJbWFwQ29tcGFyZVBhZ2UudXBkYXRlTWFwUHJvamVjdChtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL1JlcGxhY2VMb2NhbEZyb21NYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvUmVwbGFjZUxvY2FsRnJvbU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODgxNGUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvUmVwbGFjZUxvY2FsRnJvbU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5yZWxlbmcudG9vbHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5jb3JlLlRlYW1FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuQ1ZTRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLkNWU1RhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMuY29yZS5JQ1ZTUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuc3luY2luZm8uUmVzb3VyY2VTeW5jSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkuYWN0aW9ucy5Xb3Jrc3BhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLnVpLm9wZXJhdGlvbnMuUmVwbGFjZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNvcmUuSW5maW5pdGVTdWJQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogVGhpcyBhY3Rpb24gcmVwbGFjZXMgb25lIG9yIG1vcmUgcHJvamVjdHMgaW4gdGhlIGxvY2FsIHdvcmtzcGFjZQotICogd2l0aCB0aGUgdmVyc2lvbnMgcmVsZWFzZWQgdG8gdGhlIFJlbEVuZyBtYXAgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIFJlcGxhY2VMb2NhbEZyb21NYXAgZXh0ZW5kcyBXb3Jrc3BhY2VBY3Rpb24gewotCi0JLyoKLQkgKiBHZXQgdGhlIHRhZyBmcm9tIHRoZSBtYXAgZmlsZXMgaW4gdGhlIG9yZy5lY2xpcHNlLnJlbGVuZyBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ1ZTRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIENWU1RhZyBnZXRUYWcoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCU1hcEVudHJ5IGVudHJ5ID0gTWFwUHJvamVjdC5nZXREZWZhdWx0TWFwUHJvamVjdCgpLmdldE1hcEVudHJ5KChJUHJvamVjdClyZXNvdXJjZSk7Ci0JCWlmIChlbnRyeSA9PSBudWxsKSByZXR1cm4gQ1ZTVGFnLkRFRkFVTFQ7Ci0JCXJldHVybiBlbnRyeS5nZXRUYWcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkuYWN0aW9ucy5Xb3Jrc3BhY2VBY3Rpb24jaXNFbmFibGVkRm9yQWRkZWRSZXNvdXJjZXMoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZEZvckFkZGVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLnVpLmFjdGlvbnMuV29ya3NwYWNlQWN0aW9uI2lzRW5hYmxlZEZvck5vbkV4aXN0YW50UmVzb3VyY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZWRGb3JOb25FeGlzdGFudFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLnVpLmFjdGlvbnMuV29ya3NwYWNlQWN0aW9uI2lzRW5hYmxlZEZvckNWU1Jlc291cmNlKG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLklDVlNSZXNvdXJjZSkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZWRGb3JDVlNSZXNvdXJjZShJQ1ZTUmVzb3VyY2UgY3ZzUmVzb3VyY2UpIHRocm93cyBDVlNFeGNlcHRpb24gewotCQlpZiAoc3VwZXIuaXNFbmFibGVkRm9yQ1ZTUmVzb3VyY2UoY3ZzUmVzb3VyY2UpKSB7Ci0JCQkvLyBEb24ndCBlbmFibGUgaWYgdGhlcmUgYXJlIHN0aWNreSBmaWxlIHJldmlzaW9ucyBpbiB0aGUgbGluZXVwCi0JCQlpZiAoIWN2c1Jlc291cmNlLmlzRm9sZGVyKCkpIHsKLQkJCQlSZXNvdXJjZVN5bmNJbmZvIGluZm8gPSBjdnNSZXNvdXJjZS5nZXRTeW5jSW5mbygpOwotCQkJCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5nZXRUYWcoKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyByZXZpc2lvbiA9IGluZm8uZ2V0UmV2aXNpb24oKTsKLQkJCQkJU3RyaW5nIHRhZyA9IGluZm8uZ2V0VGFnKCkuZ2V0TmFtZSgpOwotCQkJCQlpZiAocmV2aXNpb24uZXF1YWxzKHRhZykpIHJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN1cGVyIHdvdWxkIGVuYWJsZSB0aGUgb3B0aW9uICphbmQqCi0JICogb25seSBwcm9qZWN0cyBhcmUgc2VsZWN0ZWQuICBUaGVyZSBpcyBubyBjb25jZXB0IG9mICJyZWxlYXNpbmciCi0JICogYW55dGhpbmcgYnV0IGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwudWkuYWN0aW9ucy5UZWFtQWN0aW9uI2lzRW5hYmxlZCgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkKCkgdGhyb3dzIFRlYW1FeGNlcHRpb24gewotCQkKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5pc0VuYWJsZWQoKTsKLQkJaWYgKCFyZXN1bHQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gc3VwZXIuZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiAoZ2V0TWFwUHJvamVjdCgpICE9IG51bGwgJiYgZ2V0TWFwUHJvamVjdCgpLm1hcHNBcmVMb2FkZWQoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLnVpLmFjdGlvbnMuUmVwbGFjZVdpdGhSZW1vdGVBY3Rpb24jcGVyZm9ybVJlcGxhY2Uob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlW10sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1SZXBsYWNlKElSZXNvdXJjZVtdIHJlc291cmNlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgVGVhbUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQltb25pdG9yLmJlZ2luVGFzayhudWxsLCAxMDAgKiByZXNvdXJjZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLQkJCW5ldyBSZXBsYWNlT3BlcmF0aW9uKGdldFRhcmdldFBhcnQoKSwgbmV3IElSZXNvdXJjZVtdIHsgcmVzb3VyY2UgfSwgZ2V0VGFnKHJlc291cmNlKSwgdHJ1ZSkucnVuKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwKSk7Ci0JCX0KLQkJbW9uaXRvci5kb25lKCk7Ci0JfQotCXByaXZhdGUgTWFwUHJvamVjdCBnZXRNYXBQcm9qZWN0KCl7Ci0JCXJldHVybiBNYXBQcm9qZWN0LmdldERlZmF1bHRNYXBQcm9qZWN0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLnVpLmFjdGlvbnMuQ1ZTQWN0aW9uI2V4ZWN1dGUob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJQWN0aW9uIGFjdGlvbikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCi0JCWZpbmFsIElSZXNvdXJjZVtdW10gcmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVtdW10ge251bGx9OwotCQlydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2sobnVsbCwgMTAwKTsJCQkJCQotCQkJCQlyZXNvdXJjZXNbMF0gPSBjaGVja092ZXJ3cml0ZU9mRGlydHlSZXNvdXJjZXMoZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKSwgbmV3IEluZmluaXRlU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMCkpOwotCQkJCX0gY2F0Y2ggKFRlYW1FeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0sIGZhbHNlIC8qIGNhbmNlbGFibGUgKi8sIFBST0dSRVNTX0JVU1lDVVJTT1IpOwotCQkKLQkJaWYgKHJlc291cmNlc1swXSA9PSBudWxsIHx8IHJlc291cmNlc1swXS5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkKLQkJcnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCXBlcmZvcm1SZXBsYWNlKHJlc291cmNlc1swXSwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoVGVhbUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfSwgdHJ1ZSwgUFJPR1JFU1NfRElBTE9HKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9SZXBvc2l0b3J5U2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL1JlcG9zaXRvcnlTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiNzkzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL1JlcG9zaXRvcnlTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuSUNWU1JlcG9zaXRvcnlMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGNvZGUgY29waWVkIGZyb20gQ1ZTUHJvamVjdFByb3BlcnRpZXNQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5U2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlJQ1ZTUmVwb3NpdG9yeUxvY2F0aW9uW10gbG9jYXRpb25zOwotCUlDVlNSZXBvc2l0b3J5TG9jYXRpb24gbG9jYXRpb247Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0hFSUdIVF9ISU5UID0gMTUwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJMRV9XSURUSF9ISU5UID0gMzAwOwotCi0JVGFibGVWaWV3ZXIgdmlld2VyOwotCUJ1dHRvbiBva0J1dHRvbjsKLQlwdWJsaWMgUmVwb3NpdG9yeVNlbGVjdGlvbkRpYWxvZyhTaGVsbCBzaGVsbCkgewotCQlzdXBlcihzaGVsbCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgT0sgYW5kIENhbmNlbCBidXR0b25zIGJ5IGRlZmF1bHQKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcGFyZW50LmdldFNoZWxsKCkuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlJlcG9zaXRvcnlTZWxlY3Rpb25EaWFsb2cuMCIpKTsgLy8kTk9OLU5MUy0xJAotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZXBvc2l0b3J5U2VsZWN0aW9uRGlhbG9nLjEiKSwgMSk7ICAvLyROT04tTkxTLTEkCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gVEFCTEVfV0lEVEhfSElOVDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gVEFCTEVfSEVJR0hUX0hJTlQ7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiBsb2NhdGlvbnM7Ci0JCQl9Ci0JCX0pOwotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJbG9jYXRpb24gPSBudWxsOwotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsb2NhdGlvbiA9IChJQ1ZTUmVwb3NpdG9yeUxvY2F0aW9uKXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl2aWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJb2tQcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQl2aWV3ZXIuc2V0SW5wdXQobG9jYXRpb25zKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3BhbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlsb2NhdGlvbiA9IG51bGw7Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25zKElDVlNSZXBvc2l0b3J5TG9jYXRpb25bXSBsb2NhdGlvbnMpIHsKLQkJdGhpcy5sb2NhdGlvbnMgPSBsb2NhdGlvbnM7Ci0JfQotCXB1YmxpYyBJQ1ZTUmVwb3NpdG9yeUxvY2F0aW9uIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9Tb3VyY2VGaWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL1NvdXJjZUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg4ZTAxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL1NvdXJjZUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnJlbGVuZy50b29sczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogQGF1dGhvciBkcm9iZXJ0cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU291cmNlRmlsZSB7Ci0JCi0JSUZpbGUgZmlsZTsKLQlMaXN0IGNvbW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCVN0cmluZ1dyaXRlciBjb250ZW50cyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQlwcml2YXRlIFN0cmluZyBuZXdMaW5lID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKi8KLQlwdWJsaWMgU291cmNlRmlsZShJRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldENvbW1lbnRTdGFydCgpOwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29tbWVudEVuZCgpOwotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQkKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07Ci0JCXRyeSB7Ci0JCQlpbnB1dFN0cmVhbSA9IGZpbGUuZ2V0Q29udGVudHMoZmFsc2UpOwotCQkJQnVmZmVyZWRSZWFkZXIgYVJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pKTsKLQkJCVN0cmluZyBhTGluZSA9IGFSZWFkZXIucmVhZExpbmUoKTsKLQkJCVN0cmluZyBjb21tZW50ID0gIiI7Ci0JCQlCdWZmZXJlZFdyaXRlciBjb250ZW50c1dyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihjb250ZW50cyk7Ci0JCQlpbnQgbGluZU51bWJlciA9IDA7Ci0JCQlpbnQgY29tbWVudFN0YXJ0ID0gMDsKLQkJCWludCBjb21tZW50RW5kID0gMDsKLQkJCWJvb2xlYW4gaW5Db21tZW50ID0gZmFsc2U7Ci0JCQkKLQkJCXdoaWxlIChhTGluZSAhPSBudWxsKSB7Ci0JCQkJY29udGVudHNXcml0ZXIud3JpdGUoYUxpbmUpOwotCQkJCWNvbnRlbnRzV3JpdGVyLm5ld0xpbmUoKTsKLQkJCQlpZiAoIWluQ29tbWVudCAmJiBhTGluZS50cmltKCkuc3RhcnRzV2l0aChnZXRDb21tZW50U3RhcnQoKSkpIHsKLQkJCQkJLy8gc3RhcnQgc2F2aW5nIGNvbW1lbnQKLQkJCQkJaW5Db21tZW50ID0gdHJ1ZTsKLQkJCQkJY29tbWVudFN0YXJ0ID0gbGluZU51bWJlcjsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGluQ29tbWVudCkgewotCQkJCQljb21tZW50ID0gY29tbWVudCArIGFMaW5lICsgbmV3TGluZTsKLQkJCQkJCQkJCi0JCQkJCWlmIChhTGluZS50cmltKCkuZW5kc1dpdGgoZ2V0Q29tbWVudEVuZCgpKSAmJiBjb21tZW50U3RhcnQgIT0gbGluZU51bWJlcikgewotCQkJCQkJLy8gc3RvcCBzYXZpbmcgY29tbWVudAotCQkJCQkJaW5Db21tZW50ID0gZmFsc2U7Ci0JCQkJCQljb21tZW50RW5kID0gbGluZU51bWJlcjsKLQkJCQkJCUJsb2NrQ29tbWVudCBhQ29tbWVudCA9IG5ldyBCbG9ja0NvbW1lbnQoY29tbWVudFN0YXJ0LCBjb21tZW50RW5kLCBjb21tZW50LnRvU3RyaW5nKCksIGdldENvbW1lbnRTdGFydCgpLCBnZXRDb21tZW50RW5kKCkpOwotCQkJCQkJY29tbWVudHMuYWRkKGFDb21tZW50KTsKLQkJCQkJCWNvbW1lbnQgPSAiIjsKLQkJCQkJCWNvbW1lbnRTdGFydCA9IDA7Ci0JCQkJCQljb21tZW50RW5kID0gMDsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlhTGluZSA9IGFSZWFkZXIucmVhZExpbmUoKTsKLQkJCQlsaW5lTnVtYmVyKys7Ci0JCQl9Ci0JCQkKLQkJCWFSZWFkZXIuY2xvc2UoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBCbG9ja0NvbW1lbnQKLQkgKi8KLQlwdWJsaWMgQmxvY2tDb21tZW50IGZpcnN0QmxvY2tDb21tZW50KCkgewotCQlpZiAoY29tbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoQmxvY2tDb21tZW50KSBjb21tZW50cy5nZXQoMCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0KFN0cmluZyBzdHJpbmcpIHsKLQkJCi0JCUlucHV0U3RyZWFtIGZpbGVTdHJlYW07Ci0JCXRyeSB7Ci0JCQlmaWxlU3RyZWFtID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCi0JCQlyZXN1bHQud3JpdGUoc3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJaW50IGFCeXRlID0gZmlsZVN0cmVhbS5yZWFkKCk7Ci0JCQl3aGlsZSAoYUJ5dGUgIT0gLTEpIHsKLQkJCQlyZXN1bHQud3JpdGUoYUJ5dGUpOwotCQkJCWFCeXRlID0gZmlsZVN0cmVhbS5yZWFkKCk7Ci0JCQl9Ci0JCQotCQkJZmlsZVN0cmVhbS5jbG9zZSgpOwotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gd3JpdGVNZSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXN1bHQudG9CeXRlQXJyYXkoKSk7Ci0JCQlmaWxlLnNldENvbnRlbnRzKHdyaXRlTWUsIElGaWxlLktFRVBfSElTVE9SWSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQkJcmVzdWx0LmNsb3NlKCk7Ci0JCQl3cml0ZU1lLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gQmxvY2tDb21tZW50Ci0JICovCi0JcHVibGljIEJsb2NrQ29tbWVudCBmaXJzdENvcHlyaWdodENvbW1lbnQoKSB7Ci0JCUl0ZXJhdG9yIGFuSXRlcmF0b3IgPSBjb21tZW50cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoYW5JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUJsb2NrQ29tbWVudCBhQ29tbWVudCA9IChCbG9ja0NvbW1lbnQpIGFuSXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGFDb21tZW50LmlzQ29weXJpZ2h0KCkpIHsKLQkJCQlyZXR1cm4gYUNvbW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaXJzdENvcHlyaWdodENvbW1lbnQKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZShCbG9ja0NvbW1lbnQgYUNvbW1lbnQsIFN0cmluZyBzdHJpbmcpIHsKLQkJCi0JCi0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBmaWxlU3RyZWFtID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCi0JCQlyZXN1bHQud3JpdGUoc3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJCi0JCQlCdWZmZXJlZFJlYWRlciBmaWxlUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaWxlU3RyZWFtKSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYUNvbW1lbnQuc3RhcnQ7IGkrKykgewotCQkJCVN0cmluZyBhTGluZSA9IGZpbGVSZWFkZXIucmVhZExpbmUoKTsKLQkJCQlyZXN1bHQud3JpdGUoYUxpbmUuZ2V0Qnl0ZXMoKSk7Ci0JCQkJcmVzdWx0LndyaXRlKG5ld0xpbmUuZ2V0Qnl0ZXMoKSk7Ci0JCQl9Ci0JCQkKLQkJCWZvciAoaW50IGkgPSBhQ29tbWVudC5zdGFydDsgaSA8IGFDb21tZW50LmVuZCArIDE7IGkrKykgewotCQkJCVN0cmluZyBhTGluZSA9IGZpbGVSZWFkZXIucmVhZExpbmUoKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGFMaW5lID0gZmlsZVJlYWRlci5yZWFkTGluZSgpOwotCQkJd2hpbGUgKGFMaW5lICE9IG51bGwpIHsKLQkJCQlyZXN1bHQud3JpdGUoYUxpbmUuZ2V0Qnl0ZXMoKSk7Ci0JCQkJcmVzdWx0LndyaXRlKG5ld0xpbmUuZ2V0Qnl0ZXMoKSk7Ci0JCQkJYUxpbmUgPSBmaWxlUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQl9Ci0JCQkKLQkJCWZpbGVTdHJlYW0uY2xvc2UoKTsKLQkJCQotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gd3JpdGVNZSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXN1bHQudG9CeXRlQXJyYXkoKSk7Ci0JCQlmaWxlLnNldENvbnRlbnRzKHdyaXRlTWUsIElGaWxlLktFRVBfSElTVE9SWSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQkJcmVzdWx0LmNsb3NlKCk7Ci0JCQl3cml0ZU1lLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQotCQotCQkKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNNdWx0aXBsZUNvcHlyaWdodHMoKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUl0ZXJhdG9yIGFuSXRlcmF0b3IgPSBjb21tZW50cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoYW5JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUJsb2NrQ29tbWVudCBhQ29tbWVudCA9IChCbG9ja0NvbW1lbnQpIGFuSXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGFDb21tZW50LmlzQ29weXJpZ2h0KCkpIHsKLQkJCQljb3VudCsrOwotCQkJfQotCQkJaWYgKGNvdW50ID4gMSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL1RhZ0FuZFJlbGVhc2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvVGFnQW5kUmVsZWFzZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2YyNDVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvVGFnQW5kUmVsZWFzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnJlbGVuZy50b29sczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uY29yZS5UZWFtRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy51aS5hY3Rpb25zLkNWU0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLQotCi0vKioKLSAqVGhpcyBjbGFzcyByZXNwb25kIHRoZSAicmVsZWFzZS4uLiIgbWVudSBhY3Rpb24gYW5kIHRyeSB0byBvcGVuIGEgd2l6YXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdBbmRSZWxlYXNlQWN0aW9uIGV4dGVuZHMgQ1ZTQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkuYWN0aW9ucy5UYWdBY3Rpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElBY3Rpb24gYWN0aW9uKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewkJCi0JCS8vU3RhcnQgdGhlIHJlbGVhc2Ugd2l6YXJkCi0JCVJlbGVhc2VXaXphcmQgd2l6YXJkID0gbmV3IFJlbGVhc2VXaXphcmQoKTsKLQkJSVJlc291cmNlW10gcHJlU2VsZWN0aW9uID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKTsKLQkJaWYocHJlU2VsZWN0aW9uICE9IG51bGwgJiYgcHJlU2VsZWN0aW9uLmxlbmd0aCAhPSAwKXsKLQkJCXdpemFyZC5zZXRQcmVTZWxlY3RlZFByb2plY3RzKHByZVNlbGVjdGlvbik7Ci0JCX0KLQkJd2l6YXJkLmV4ZWN1dGUoZ2V0U2hlbGwoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC51aS5hY3Rpb25zLlRlYW1BY3Rpb24jaXNFbmFibGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZWQoKSB0aHJvd3MgVGVhbUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzLnNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7CQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkuYWN0aW9ucy5DVlNBY3Rpb24jZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKQotCSAqIE92ZXJ3cml0ZSB0aGUgbWV0aG9kIHRvIGVsaW1pbmF0ZSBudWxsIHBvbnRlciBleGNlcHRpb24gd2hlbiBmaXJzdCB0aW1lIHN0YXJ0IHRoZSB3aXphcmQKLQkgKi8KLQlwcm90ZWN0ZWQgSVJlc291cmNlW10gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgcmV0dXJuIG5ldyBJUmVzb3VyY2VbMF07Ci0JCXJldHVybiBzdXBlci5nZXRTZWxlY3RlZFJlc291cmNlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvVGFnQW5kUmVsZWFzZU9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9UYWdBbmRSZWxlYXNlT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MGNmOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9UYWdBbmRSZWxlYXNlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnJlbGVuZy50b29sczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuTXVsdGlSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLnVpLkNWU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy51aS5vcGVyYXRpb25zLlRhZ09wZXJhdGlvbjsKLQotLyoqCi0gKiAgVGhpcyBjbGFzcyBvdmVycmlkZXMgdGhlIGJhc2ljIHRhZyBvcGVyYXRpb24gaW4gb3JkZXIgdG8gdXBkYXRlIGFuZCBwb3NzaWJseSBjb21taXQKLSAqIHRoZSBtYXAgZmlsZSB1c2VkIGJ5IHRoZSBFY2xpcHNlIFJlbEVuZyBidWlsZGVyLgotICovCi1wdWJsaWMgY2xhc3MgVGFnQW5kUmVsZWFzZU9wZXJhdGlvbiBleHRlbmRzIFRhZ09wZXJhdGlvbiB7Ci0JCi0JcHJpdmF0ZSBJUmVzb3VyY2VbXSBzZWxlY3RlZFByb2plY3RzOwotCXByaXZhdGUgQ1ZTVGFnIHRhZzsKLQlwcml2YXRlIFN0cmluZyBjb21tZW50OwotCXByaXZhdGUgTWFwUHJvamVjdCBtYXBQcm9qZWN0OwotCQotCXB1YmxpYyBUYWdBbmRSZWxlYXNlT3BlcmF0aW9uKFNoZWxsIHNoZWxsLCBNYXBQcm9qZWN0IG1hcFByb2plY3QsIElSZXNvdXJjZVtdIHJlc291cmNlcywgQ1ZTVGFnIHQsIFN0cmluZyBjKSB7Ci0gCQlzdXBlcihzaGVsbCwgcmVzb3VyY2VzKTsKLQkJc2VsZWN0ZWRQcm9qZWN0cyA9IG5ldyBJUmVzb3VyY2VbcmVzb3VyY2VzLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkocmVzb3VyY2VzLDAsc2VsZWN0ZWRQcm9qZWN0cywwLHJlc291cmNlcy5sZW5ndGgpOwotCQl0aGlzLnRhZyA9IHQ7Ci0JCXNldFRhZyh0YWcpOwotCQl0aGlzLmNvbW1lbnQgPSBjOwotCQl0aGlzLm1hcFByb2plY3QgPSBtYXBQcm9qZWN0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkub3BlcmF0aW9ucy5UYWdPcGVyYXRpb24jdGFnKG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLkNWU1RlYW1Qcm92aWRlciwgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlW10sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHRhZygKLQkJQ1ZTVGVhbVByb3ZpZGVyIHByb3ZpZGVyLAotCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMsCi0JCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpCi0JCXRocm93cyBDVlNFeGNlcHRpb24gewotCQkKLQkJLy8gVGFnIHRoZSByZXNvdXJjZQotCQlwcm9ncmVzcy5iZWdpblRhc2soIlJlbGVhc2luZyBwcm9qZWN0ICIgKyBwcm92aWRlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCAxMDApOwotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnRhZyhwcm92aWRlciwgcmVzb3VyY2VzLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzLCA5NSkpOwotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgcmV0dXJuIHN0YXR1czsKLQkJcHJvZ3Jlc3MuZG9uZSgpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy51aS5vcGVyYXRpb25zLkNWU09wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ1ZTRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCJUYWdnaW5nIHdpdGggIiArIGdldFRhZygpLmdldE5hbWUoKSwgMTAwKTsKLQkJc3VwZXIuZXhlY3V0ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDk1KSk7Ci0JCQotCQlpZiAoIWVycm9yc09jY3VycmVkKCkpIHsKLQkJCXVwZGF0ZU1hcEZpbGUoKTsKLQkJCXRyeSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKCJDb21taXR0aW5nIGNoYW5nZWQgbWFwIGZpbGVzIik7Ci0JCQkJbWFwUHJvamVjdC5jb21taXRNYXBQcm9qZWN0KGNvbW1lbnQsbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBDVlNFeGNlcHRpb24ud3JhcEV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQltb25pdG9yLmRvbmUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkub3BlcmF0aW9ucy5SZXBvc2l0b3J5UHJvdmlkZXJPcGVyYXRpb24jZ2V0U2NoZWR1bGluZ1J1bGUob3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuQ1ZTVGVhbVByb3ZpZGVyKQotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoQ1ZTVGVhbVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCS8vIFdlIG5lZWQgYSBydWxlIG9uIGJvdGggdGhlIHByb3ZpZGVyIGFuZCB0aGUgcmVsZW5nIG1hcCBwcm9qZWN0Ci0JCUlTY2hlZHVsaW5nUnVsZSBydWxlID0gc3VwZXIuZ2V0U2NoZWR1bGluZ1J1bGUocHJvdmlkZXIpOwotCQlyZXR1cm4gbmV3IE11bHRpUnVsZShuZXcgSVNjaGVkdWxpbmdSdWxlW10ge3J1bGUsIG1hcFByb2plY3QuZ2V0UHJvamVjdCgpfSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSB0YWcgZm9yIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBhcHByb3ByaWF0ZSBtYXAgZmlsZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGFnc0luTWFwRmlsZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdCkgdGhyb3dzIENWU0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltYXBQcm9qZWN0LnVwZGF0ZUZpbGUocHJvamVjdCwgdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgQ1ZTRXhjZXB0aW9uLndyYXBFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU1hcEZpbGUoKXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZFByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihzZWxlY3RlZFByb2plY3RzW2ldIGluc3RhbmNlb2YgSVByb2plY3QpewotCQkJCXRyeSB7Ci0JCQkJCXVwZGF0ZVRhZ3NJbk1hcEZpbGUoKElQcm9qZWN0KXNlbGVjdGVkUHJvamVjdHNbaV0sIHRhZy5nZXROYW1lKCkpOwotCQkJCX0gY2F0Y2ggKENWU0V4Y2VwdGlvbiBlMSkgewotCQkJCQlDVlNVSVBsdWdpbi5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgbnVsbCwgbnVsbCwgZTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9UYWdNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvVGFnTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ODc3ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9UYWdNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmNvcmUuVGVhbUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMuY29yZS5DVlNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuQ1ZTUHJvdmlkZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuQ1ZTVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLklDVlNSZXBvc2l0b3J5TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuSUNWU1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy5jb3JlLmNvbm5lY3Rpb24uQ1ZTUmVwb3NpdG9yeUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy51aS5DVlNVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkuYWN0aW9ucy5UYWdJblJlcG9zaXRvcnlBY3Rpb247Ci0KLS8qKgotICogVGFncyB0aGUgdmVyc2lvbnMgaW4gYSBtYXAgZmlsZSB3aXRoIGFub3RoZXIgdGFnCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdNYXAgZXh0ZW5kcyBUYWdJblJlcG9zaXRvcnlBY3Rpb24gewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLnVpLmFjdGlvbnMuQ1ZTQWN0aW9uI2dldFNlbGVjdGVkQ1ZTUmVzb3VyY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUNWU1Jlc291cmNlW10gZ2V0U2VsZWN0ZWRDVlNSZXNvdXJjZXMoKSB7Ci0JCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCk7Ci0JCUxpc3QgaWRlbnRpZmllcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0JCQl0cnkgewotCQkJCVN0cmluZ1tdIHN0cmluZ3MgPSBMb2FkTWFwLnJlYWRSZWZlcmVuY2VTdHJpbmdzKChJRmlsZSlyZXNvdXJjZSk7Ci0JCQkJaWRlbnRpZmllcnMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RyaW5ncykpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJYWRkU3RhdHVzKENWU0V4Y2VwdGlvbi53cmFwRXhjZXB0aW9uKGUpLmdldFN0YXR1cygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0Q1ZTUmVzb3VyY2VzRm9yKChTdHJpbmdbXSkgaWRlbnRpZmllcnMudG9BcnJheShuZXcgU3RyaW5nW2lkZW50aWZpZXJzLnNpemUoKV0pKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5ncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElDVlNSZXNvdXJjZVtdIGdldENWU1Jlc291cmNlc0ZvcihTdHJpbmdbXSByZWZlcmVuY2VTdHJpbmdzKSB7Ci0JCU1hcCBwcmV2aW91c2x5U2VsZWN0ZWRSZXBvc2l0b3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlpbnQgc2l6ZSA9IHJlZmVyZW5jZVN0cmluZ3MubGVuZ3RoOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihyZWZlcmVuY2VTdHJpbmdzW2ldLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmVyc2lvbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWlmICghdmVyc2lvbi5lcXVhbHMoIjEuMCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBCYWlsIG91dCwgdGhpcyBpcyBhIG5ld2VyIHZlcnNpb24KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHJlcG8gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJSUNWU1JlcG9zaXRvcnlMb2NhdGlvbiBzdG9yZWRsb2NhdGlvbiA9IGdldExvY2F0aW9uRnJvbVN0cmluZyhyZXBvKTsKLQkJCQlJQ1ZTUmVwb3NpdG9yeUxvY2F0aW9uIGxvY2F0aW9uID0gKElDVlNSZXBvc2l0b3J5TG9jYXRpb24pcHJldmlvdXNseVNlbGVjdGVkUmVwb3NpdG9yaWVzLmdldChzdG9yZWRsb2NhdGlvbik7Ci0JCQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCQkJbG9jYXRpb24gPSBnZXRXcml0YWJsZVJlcG9zaXRvcnlMb2NhdGlvbihzdG9yZWRsb2NhdGlvbik7Ci0JCQkJCXByZXZpb3VzbHlTZWxlY3RlZFJlcG9zaXRvcmllcy5wdXQoc3RvcmVkbG9jYXRpb24sIGxvY2F0aW9uKTsKLQkJCQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHJldHVybiBuZXcgSUNWU1Jlc291cmNlWzBdOwotCQkJCX0KLQkJCQlTdHJpbmcgbW9kdWxlID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQlDVlNUYWcgdGFnID0gQ1ZTVGFnLkRFRkFVTFQ7Ci0JCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJU3RyaW5nIHRhZ05hbWUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJCXRhZyA9IG5ldyBDVlNUYWcodGFnTmFtZSwgQ1ZTVGFnLlZFUlNJT04pOwotCQkJCX0KLQkJCQlyZXN1bHQuYWRkKGxvY2F0aW9uLmdldFJlbW90ZUZvbGRlcihtb2R1bGUsIHRhZykpOwotCQkJfSBjYXRjaCAoQ1ZTRXhjZXB0aW9uIGUpIHsKLQkJCQlhZGRTdGF0dXMoZQkuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNWU1Jlc291cmNlW10pIHJlc3VsdC50b0FycmF5KG5ldyBJQ1ZTUmVzb3VyY2VbcmVzdWx0LnNpemUoKV0pOwotCX0KLQkKLQlwcml2YXRlIElDVlNSZXBvc2l0b3J5TG9jYXRpb24gZ2V0TG9jYXRpb25Gcm9tU3RyaW5nKFN0cmluZyByZXBvKSB0aHJvd3MgQ1ZTRXhjZXB0aW9uIHsKLQkJLy8gY3JlYXRlIHRoZSBuZXcgbG9jYXRpb24KLQkJSUNWU1JlcG9zaXRvcnlMb2NhdGlvbiBuZXdMb2NhdGlvbiA9IENWU1JlcG9zaXRvcnlMb2NhdGlvbi5mcm9tU3RyaW5nKHJlcG8pOwotCQlpZiAobmV3TG9jYXRpb24uZ2V0VXNlcm5hbWUoKSA9PSBudWxsIHx8IG5ld0xvY2F0aW9uLmdldFVzZXJuYW1lKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJLy8gbG9vayBmb3IgYW4gZXhpc3RpbmcgbG9jYXRpb24gdGhhdCBtYXRjaGVkCi0JCQlJQ1ZTUmVwb3NpdG9yeUxvY2F0aW9uW10gbG9jYXRpb25zID0gQ1ZTUHJvdmlkZXJQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0S25vd25SZXBvc2l0b3JpZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNWU1JlcG9zaXRvcnlMb2NhdGlvbiBsb2NhdGlvbiA9IGxvY2F0aW9uc1tpXTsKLQkJCQlpZiAobG9jYXRpb24uZ2V0TWV0aG9kKCkgPT0gbmV3TG9jYXRpb24uZ2V0TWV0aG9kKCkKLQkJCQkJJiYgbG9jYXRpb24uZ2V0SG9zdCgpLmVxdWFscyhuZXdMb2NhdGlvbi5nZXRIb3N0KCkpCi0JCQkJCSYmIGxvY2F0aW9uLmdldFBvcnQoKSA9PSBuZXdMb2NhdGlvbi5nZXRQb3J0KCkKLQkJCQkJJiYgbG9jYXRpb24uZ2V0Um9vdERpcmVjdG9yeSgpLmVxdWFscyhuZXdMb2NhdGlvbi5nZXRSb290RGlyZWN0b3J5KCkpKQotCQkJCQkJcmV0dXJuIGxvY2F0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdMb2NhdGlvbjsKLQl9Ci0JCi0JcHVibGljIElDVlNSZXBvc2l0b3J5TG9jYXRpb24gZ2V0V3JpdGFibGVSZXBvc2l0b3J5TG9jYXRpb24oSUNWU1JlcG9zaXRvcnlMb2NhdGlvbiBzdG9yZWRMb2NhdGlvbikgewotCQkvLyBGaW5kIG91dCB3aGljaCByZXBvIGxvY2F0aW9ucyBhcmUgYXBwcm9wcmlhdGUKLQkJSUNWU1JlcG9zaXRvcnlMb2NhdGlvbltdIGxvY2F0aW9ucyA9IENWU1VJUGx1Z2luLmdldFBsdWdpbigpLmdldFJlcG9zaXRvcnlNYW5hZ2VyKCkuZ2V0S25vd25SZXBvc2l0b3J5TG9jYXRpb25zKCk7Ci0JCUxpc3QgY29tcGF0aWJsZUxvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlDVlNSZXBvc2l0b3J5TG9jYXRpb24gbG9jYXRpb24gPSBsb2NhdGlvbnNbaV07Ci0JCQkvLyBPbmx5IGxvY2F0aW9ucyB3aXRoIHRoZSBzYW1lIGhvc3QgYW5kIHJvb3QgYXJlIGVsaWdpYmxlCi0JCQlpZiAoIWxvY2F0aW9uLmdldEhvc3QoKS5lcXVhbHMoc3RvcmVkTG9jYXRpb24uZ2V0SG9zdCgpKSkgY29udGludWU7Ci0JCQlpZiAoIWxvY2F0aW9uLmdldFJvb3REaXJlY3RvcnkoKS5lcXVhbHMoc3RvcmVkTG9jYXRpb24uZ2V0Um9vdERpcmVjdG9yeSgpKSkgY29udGludWU7Ci0JCQljb21wYXRpYmxlTG9jYXRpb25zLmFkZChsb2NhdGlvbik7Ci0JCX0KLQkJUmVwb3NpdG9yeVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgUmVwb3NpdG9yeVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldExvY2F0aW9ucygoSUNWU1JlcG9zaXRvcnlMb2NhdGlvbltdKWNvbXBhdGlibGVMb2NhdGlvbnMudG9BcnJheShuZXcgSUNWU1JlcG9zaXRvcnlMb2NhdGlvbltjb21wYXRpYmxlTG9jYXRpb25zLnNpemUoKV0pKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJSUNWU1JlcG9zaXRvcnlMb2NhdGlvbiBsb2NhdGlvbiA9IGRpYWxvZy5nZXRMb2NhdGlvbigpOwotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwudWkuYWN0aW9ucy5UZWFtQWN0aW9uI2lzRW5hYmxlZCgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkKCkgdGhyb3dzIFRlYW1FeGNlcHRpb24gewotCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBnZXRTZWxlY3RlZFJlc291cmNlcygpOwotCQlyZXR1cm4gKHJlc291cmNlcy5sZW5ndGggPj0gMCAgJiYgTWFwUHJvamVjdC5nZXREZWZhdWx0TWFwUHJvamVjdCgpLm1hcHNBcmVMb2FkZWQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy9zcmMvb3JnL2VjbGlwc2UvcmVsZW5nL3Rvb2xzL1RhZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvVGFnUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTg3ODEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvVGFnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLmNvcmUuQ1ZTVGFnOwotCi0vKioKLSAqVGhpcyBjbGFzcyBleHRlbmRzIDxjb2RlPldpemFyZFBhZ2U8Y29kZT4uIEl0IGFsbG93cyB1c2VyIHRvIGVudGVyIGEgdGFnIG5hbWUgYW5kIG1ha2Ugc29tZSBhZGRpdGlvbmFsIAotICpvcHRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgVGFnUGFnZSBleHRlbmRzIFdpemFyZFBhZ2V7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdGFnU3RyaW5nOwotCXByaXZhdGUgQ29tYm8gdGFnQ29tYm87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTUJPX0hJU1RPUllfTEVOR1RIID0gNTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX1RBR19QUkVGSVggPSAidiI7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gbW92ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiB2YWxpZGF0ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBjb21wYXJlQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGNvbW1pdEJ1dHRvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBtb3ZlQnV0dG9uU2VsZWN0ZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVCdXR0b25TZWxlY3RlZDsKLQlwcml2YXRlIGJvb2xlYW4gY29tbWl0QnV0dG9uU2VsZWN0ZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlQnV0dG9uU2VsZWN0ZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0Vycm9yOy8vZm9yIHRhZyB2YWxpZGF0aW9uCi0JCi0JcHJpdmF0ZSBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M7Ci0JcHJpdmF0ZSBTdHJpbmcgVEFHX0tFWSA9IE1lc3NhZ2VzLmdldFN0cmluZygiVGFnUGFnZS4xIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBDT01QQVJFX0JVVFRPTl9LRVkgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIlRhZ1BhZ2UuMiIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgQ09NTUlUX0JVVFRPTl9LRVkgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIlRhZ1BhZ2UuMyIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgTU9WRV9CVVRUT05fS0VZID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJUYWdQYWdlLjQiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIFZBTElEQVRFX0JVVFRPTl9LRVkgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIlRhZ1BhZ2UuNSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gdGl0bGVJbWFnZQotCSAqLwotCXB1YmxpYyBUYWdQYWdlKFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHRpdGxlLCBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MsIEltYWdlRGVzY3JpcHRvciBpbWFnZSkgewotCQlzdXBlcihwYWdlTmFtZSwgdGl0bGUsIGltYWdlKTsKLQkJdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY29tcG9zaXRlLnNldEZvbnQoZm9udCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCk7CSAJIAotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiVGFnUGFnZS42IikpOyAvLyROT04tTkxTLTEkCi0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlsYWJlbC5zZXRGb250KGZvbnQpOwotCQkKLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXRhZ1N0cmluZyA9IG51bGw7Ci0JCQkJbW9kaWZ5VGFnKCk7Ci0JCQl9Ci0JCX07Ci0JCQotCQl0YWdDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsU1dULk5PTkUpOwotCQl0YWdDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCXRhZ0NvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIGxpc3RlbmVyKTsKLQkJdGFnQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CQkKLQkJdGFnQ29tYm8uc2V0Rm9udChmb250KTsKLQkJCQkKLQkJbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQltb3ZlQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCW1vdmVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlRhZ1BhZ2UuNyIpKTsgLy8kTk9OLU5MUy0xJAotCQltb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vdmVCdXR0b25TZWxlY3RlZCA9IG1vdmVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCQltb3ZlQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0JCQkKLQkJdmFsaWRhdGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSxTV1QuQ0hFQ0spOwotCQl2YWxpZGF0ZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiVGFnUGFnZS44IikpOyAvLyROT04tTkxTLTEkCi0JCXZhbGlkYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXZhbGlkYXRlQnV0dG9uU2VsZWN0ZWQgPSB2YWxpZGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0JCQotCQl9KTsKLQkJdmFsaWRhdGVCdXR0b24uc2V0Rm9udChmb250KTsKLQkJCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQlncm91cC5zZXRGb250KGZvbnQpOwotCQkKLQkJTGFiZWwgbWFwTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5IT1JJWk9OVEFMKTsJIAotCQltYXBMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiVGFnUGFnZS45IikpOyAvLyROT04tTkxTLTEkCi0JCW1hcExhYmVsLnNldEZvbnQoZm9udCk7Ci0JCQotCQljb21wYXJlQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCxTV1QuUkFESU8pOwotCQljb21wYXJlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJUYWdQYWdlLjEwIikpOyAvLyROT04tTkxTLTEkCi0JCWNvbXBhcmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY29tcGFyZUJ1dHRvblNlbGVjdGVkID0gY29tcGFyZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCQl1cGRhdGVGaW5pc2hTdGF0dXMoKTsKLQkJCX0JCQotCQl9KTsKLQkJY29tcGFyZUJ1dHRvbi5zZXRGb250KGZvbnQpOwotCQkKLQkJY29tbWl0QnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCxTV1QuUkFESU8pOwotCQljb21taXRCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlRhZ1BhZ2UuMTEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29tbWl0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJY29tbWl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY29tbWl0QnV0dG9uU2VsZWN0ZWQgPSBjb21taXRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7CQotCQkJfQotCQl9KTsJCi0JCWNvbW1pdEJ1dHRvbi5zZXRGb250KGZvbnQpOwotCQkKLQkJaW5pdGlhbGl6ZVBhZ2UoKTsKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQkKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUYWdTdHJpbmcoKXsKLQkJcmV0dXJuIHRhZ1N0cmluZzsKLQl9Ci0JLyoqCi0JICogVmFsaWRhdGVzIHRhZyBuYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVGFnKFN0cmluZyB0YWcpewotCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0JCWhhc0Vycm9yID0gZmFsc2U7Ci0JCWlmKHRhZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQloYXNFcnJvciA9IHRydWU7Ci0JCX0gZWxzZSB7CQkKLQkJCUlTdGF0dXMgc3RhdHVzID0gQ1ZTVGFnLnZhbGlkYXRlVGFnTmFtZSh0YWcpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJbWVzc2FnZSA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkJaGFzRXJyb3IgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vdmVCdXR0b25TZWxlY3RlZCgpewotCQlyZXR1cm4gbW92ZUJ1dHRvblNlbGVjdGVkOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlQnV0dG9uU2VsZWN0ZWQoKXsKLQkJcmV0dXJuIGNvbXBhcmVCdXR0b25TZWxlY3RlZDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gY29tbWl0QnV0dG9uU2VsZWN0ZWQoKXsKLQkJcmV0dXJuIGNvbW1pdEJ1dHRvblNlbGVjdGVkIDsKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGlzUGFnZUNvbXBsZXRlZCgpewotCQlyZXR1cm4gKCFoYXNFcnJvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVNldHRpbmdzKCl7Ci0JCVN0cmluZ1tdIHRhZ3MgPSBzZXR0aW5ncy5nZXRBcnJheShUQUdfS0VZKTsKLQkJaWYgKHRhZ3MgPT0gbnVsbCkgdGFncyA9IG5ldyBTdHJpbmdbMF07Ci0JCXRhZ3MgPSBhZGRUb1RhZ0xpc3QodGFncywgdGFnQ29tYm8uZ2V0VGV4dCgpKTsKLQkJc2V0dGluZ3MucHV0KFRBR19LRVksdGFncyk7Ci0JCXNldHRpbmdzLnB1dChDT01QQVJFX0JVVFRPTl9LRVksY29tcGFyZUJ1dHRvblNlbGVjdGVkKTsKLQkJc2V0dGluZ3MucHV0KENPTU1JVF9CVVRUT05fS0VZICxjb21taXRCdXR0b25TZWxlY3RlZCk7Ci0JCXNldHRpbmdzLnB1dChNT1ZFX0JVVFRPTl9LRVkgLG1vdmVCdXR0b25TZWxlY3RlZCk7Ci0JCXNldHRpbmdzLnB1dChWQUxJREFURV9CVVRUT05fS0VZLHZhbGlkYXRlQnV0dG9uU2VsZWN0ZWQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVhZFNldHRpbmdzKCl7Ci0JCWlmKHNldHRpbmdzLmdldChDT01QQVJFX0JVVFRPTl9LRVkpICE9IG51bGwpewotCQkJY29tcGFyZUJ1dHRvbi5zZXRTZWxlY3Rpb24oc2V0dGluZ3MuZ2V0Qm9vbGVhbihDT01QQVJFX0JVVFRPTl9LRVkpKTsKLQkJCWNvbXBhcmVCdXR0b25TZWxlY3RlZCA9IHNldHRpbmdzLmdldEJvb2xlYW4oQ09NUEFSRV9CVVRUT05fS0VZKTsKLQkJfWVsc2V7Ci0JCQljb21wYXJlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWNvbXBhcmVCdXR0b25TZWxlY3RlZCA9IHRydWU7Ci0JCX0KLQkJaWYoc2V0dGluZ3MuZ2V0KENPTU1JVF9CVVRUT05fS0VZKSAhPSBudWxsKXsJCQkKLQkJCWNvbW1pdEJ1dHRvbi5zZXRTZWxlY3Rpb24oc2V0dGluZ3MuZ2V0Qm9vbGVhbihDT01NSVRfQlVUVE9OX0tFWSkpOwotCQkJY29tbWl0QnV0dG9uU2VsZWN0ZWQgPSBzZXR0aW5ncy5nZXRCb29sZWFuKENPTU1JVF9CVVRUT05fS0VZKTsKLQkJfWVsc2V7Ci0JCQljb21taXRCdXR0b24uc2V0U2VsZWN0aW9uKCBmYWxzZSk7Ci0JCQljb21taXRCdXR0b25TZWxlY3RlZCA9IGZhbHNlOwotCQl9Ci0JCWlmKHNldHRpbmdzLmdldChNT1ZFX0JVVFRPTl9LRVkpICE9IG51bGwpewotCQkJbW92ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oc2V0dGluZ3MuZ2V0Qm9vbGVhbihNT1ZFX0JVVFRPTl9LRVkpKTsKLQkJCW1vdmVCdXR0b25TZWxlY3RlZCA9IHNldHRpbmdzLmdldEJvb2xlYW4oTU9WRV9CVVRUT05fS0VZKTsKLQkJfWVsc2V7Ci0JCQltb3ZlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQltb3ZlQnV0dG9uU2VsZWN0ZWQgPSBmYWxzZTsKLQkJfQotCQlpZihzZXR0aW5ncy5nZXQoVkFMSURBVEVfQlVUVE9OX0tFWSkgIT0gbnVsbCl7Ci0JCQl2YWxpZGF0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oIHNldHRpbmdzLmdldEJvb2xlYW4oVkFMSURBVEVfQlVUVE9OX0tFWSApKTsKLQkJCXZhbGlkYXRlQnV0dG9uU2VsZWN0ZWQgPSBzZXR0aW5ncy5nZXRCb29sZWFuKFZBTElEQVRFX0JVVFRPTl9LRVkpOwotCQl9ZWxzZXsKLQkJCXZhbGlkYXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCXZhbGlkYXRlQnV0dG9uU2VsZWN0ZWQgPSB0cnVlOwotCQl9Ci0JCS8vaW5zZXJ0IHRoZSB0YWcgdGVtcGxhdGUgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QgYW5kIGF2b2lkIGR1cGxpY2F0ZWQgaXRlbXMuCi0JCWlmKHNldHRpbmdzLmdldEFycmF5KFRBR19LRVkpID09IG51bGwpewotCQkJdGFnQ29tYm8uYWRkKGdldFRhZ1RlbXBsYXRlKCkpOwotCQl9ZWxzZXsJCQkKLQkJCVN0cmluZ1tdIHNhdmVkVGFncyA9IHNldHRpbmdzLmdldEFycmF5KFRBR19LRVkpOwotCQkJaWYgKHNhdmVkVGFncyAhPSBudWxsICYmIHNhdmVkVGFncy5sZW5ndGggPiAwKSB7Ci0JCQkJU3RyaW5nW10gbmV3VGFncyA9IGFkZFRvVGFnTGlzdCggc2F2ZWRUYWdzLGdldFRhZ1RlbXBsYXRlKCkpOwotCQkJCWZvcihpbnQgaSA9IDA7IGk8IG5ld1RhZ3MubGVuZ3RoOyBpKyspewotCQkJCQl0YWdDb21iby5hZGQobmV3VGFnc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZXsKLQkJCQl0YWdDb21iby5hZGQoZ2V0VGFnVGVtcGxhdGUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQYWdlKCl7Ci0JCWlmKHNldHRpbmdzICE9IG51bGwpewotCQkJcmVhZFNldHRpbmdzKCk7Ci0JCX0KLQkJZWxzZXsKLQkJCWNvbW1pdEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJY29tcGFyZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl2YWxpZGF0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQltb3ZlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQljb21taXRCdXR0b25TZWxlY3RlZCA9IGZhbHNlOwotCQkJY29tcGFyZUJ1dHRvblNlbGVjdGVkID0gdHJ1ZTsKLQkJCW1vdmVCdXR0b25TZWxlY3RlZCA9IGZhbHNlOwotCQkJdmFsaWRhdGVCdXR0b25TZWxlY3RlZCA9IHRydWU7Ci0JCQl0YWdDb21iby5hZGQoZ2V0VGFnVGVtcGxhdGUoKSk7Ci0JCX0KLQkJaGFzRXJyb3IgPSBmYWxzZTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBtb2RpZnlUYWcoKSB7Ci0JCXRhZ1N0cmluZyA9IHRhZ0NvbWJvLmdldFRleHQoKTsKLQkJdmFsaWRhdGVUYWcodGFnU3RyaW5nKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlZCgpKTsKLQl9Ci0JCi0JLy9UaGUgZGVmYXVsdCB0YWcgZm9ybWF0IGlzICJ2WVlZWU1NREQiCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFnVGVtcGxhdGUoKXsKLQkJU3RyaW5nIHRhZyA9IGdldFRhZ1ByZWZpeCgpOyAvLyROT04tTkxTLTEkCi0JCUNhbGVuZGFyIHRvZGF5ID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoICk7Ci0JCXRhZyArPSB0b2RheS5nZXQoQ2FsZW5kYXIuWUVBUik7Ci0JCWludCBtb250aCA9IHRvZGF5LmdldChDYWxlbmRhci5NT05USCkgKyAxOwotCQlpZihtb250aCA8IDEwKXsKLQkJCXRhZyArPSAiMCIgKyBtb250aDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2V7Ci0JCQl0YWcgKz0gbW9udGg7Ci0JCX0KLQkJaW50IGRheSA9IHRvZGF5LmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpOwotCQlpZiAoZGF5IDwgMTApewotCQkJdGFnICs9ICIwIiArIGRheTsKLQkJfQotCQllbHNlewotCQkJdGFnICs9IGRheTsKLQkJfQotCQlyZXR1cm4gdGFnOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2Ujc2V0VmlzaWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCVJlbGVhc2VXaXphcmQgd2l6YXJkID0gKFJlbGVhc2VXaXphcmQpZ2V0V2l6YXJkKCk7Ci0JCWJvb2xlYW4gYiA9IHdpemFyZC5nZXRQcm9qZWN0U2VsZWN0aW9uUGFnZSgpLmlzQ29tcGFyZUJ1dHRvbkNoZWNrZWQoKTsKLQkJaWYgKHZpc2libGUgJiYgIWIpIHsJCQotCQkJLy9JbiBjYXNlIHRoZSB3aXphcmQgc3dpdGNoZXMgdG8gdGhpcyBwYWdlIGZyb20gUHJvamVjdCBTZWxlY3Rpb24gUGFnZSBhbmQgdGhlcmUgYXJlIHNvbWUgcHJvamVjdHMgaGF2ZSBvdXRnb2luZyBjaGFuZ2VzCi0JCQl3aXphcmQudXBkYXRlU2VsZWN0ZWRQcm9qZWN0KCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0ZUJ1dHRvblNlbGVjdGVkKCl7Ci0JCXJldHVybiB2YWxpZGF0ZUJ1dHRvblNlbGVjdGVkOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZ1tdIGFkZFRvVGFnTGlzdChTdHJpbmdbXSBoaXN0b3J5LCBTdHJpbmcgbmV3RW50cnkpIHsKLQkJQXJyYXlMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoaGlzdG9yeSkpOwotCQlhZGRUb1RhZ0xpc3QobCwgbmV3RW50cnkpOwotCQlTdHJpbmdbXSByID0gbmV3IFN0cmluZ1tsLnNpemUoKV07Ci0JCWwudG9BcnJheShyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRUb1RhZ0xpc3QoTGlzdCBoaXN0b3J5LCBTdHJpbmcgbmV3RW50cnkpIHsKLQkJaGlzdG9yeS5yZW1vdmUobmV3RW50cnkpOwotCQloaXN0b3J5LmFkZCgwLG5ld0VudHJ5KTsJCi0JCS8vIHNpbmNlIG9ubHkgb25lIG5ldyBpdGVtIHdhcyBhZGRlZCwgd2UgY2FuIGJlIG92ZXIgdGhlIGxpbWl0Ci0JCS8vIGJ5IGF0IG1vc3Qgb25lIGl0ZW0KLQkJaWYgKGhpc3Rvcnkuc2l6ZSgpID4gQ09NQk9fSElTVE9SWV9MRU5HVEgpCi0JCQloaXN0b3J5LnJlbW92ZShDT01CT19ISVNUT1JZX0xFTkdUSCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFRhZ1ByZWZpeCgpewotCQlpZihzZXR0aW5ncyAhPSBudWxsKXsKLQkJCWlmKHNldHRpbmdzLmdldEFycmF5KFRBR19LRVkpICE9IG51bGwpewotCQkJCVN0cmluZ1tdIHRhZ3MgPSBzZXR0aW5ncy5nZXRBcnJheShUQUdfS0VZKTsKLQkJCQlpZiAodGFncyAhPSBudWxsICYmIHRhZ3MubGVuZ3RoID4gMCkgewotCQkJCQlTdHJpbmcgcyA9cGFyc2VGaXJzdFRhZyh0YWdzWzBdKTsKLQkJCQkJaWYocyAhPSBudWxsKSByZXR1cm4gczsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIERFRkFVTFRfVEFHX1BSRUZJWDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcGFyc2VGaXJzdFRhZyhTdHJpbmcgcyl7Ci0JCWlmKHMgPT0gbnVsbClyZXR1cm4gbnVsbDsKLQkJaW50IGxlbmd0aCA9IHMubGVuZ3RoKCk7Ci0JCWlmKGxlbmd0aCA9PSAwIHx8ICFDaGFyYWN0ZXIuIGlzTGV0dGVyKHMuY2hhckF0KDApKSlyZXR1cm4gbnVsbDsKLQkJaW50IGkgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChzLmNoYXJBdChpKSkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcy5zdWJzdHJpbmcoMCwgaSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVGaW5pc2hTdGF0dXMoKXsKLQkJKChSZWxlYXNlV2l6YXJkKWdldFdpemFyZCgpKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5yZWxlbmcudG9vbHMvc3JjL29yZy9lY2xpcHNlL3JlbGVuZy90b29scy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzc5NjU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9yZWxlbmcvdG9vbHMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVJlbGVhc2VXaXphcmQuNT1Qcm9qZWN0U2VsZWN0aW9uUGFnZQotUmVsZWFzZVdpemFyZC42PVByb2plY3QgU2VsZWN0aW9uCi1SZWxlYXNlV2l6YXJkLjc9U2VsZWN0IHRoZSBwcm9qZWN0cyB0byBiZSBjb25zaWRlcmVkIGZvciByZWxlYXNlCi1SZWxlYXNlV2l6YXJkLjg9VGFnUGFnZQotUmVsZWFzZVdpemFyZC45PVJlbGVhc2UgVGFnCi1SZWxlYXNlV2l6YXJkLjEwPUVudGVyIHRoZSB0YWcgdG8gYmUgdXNlZCBmb3IgdGhpcyByZWxlYXNlCi1SZWxlYXNlV2l6YXJkLjExPVByb2plY3RDb21wYXJlUGFnZQotUmVsZWFzZVdpemFyZC4xMj1DaGFuZ2VkIFByb2plY3RzCi1SZWxlYXNlV2l6YXJkLjEzPVJldmlldyB0aGUgY2hhbmdlcyB0aGF0IHdpbGwgYmUgcmVsZWFzZWQKLVJlbGVhc2VXaXphcmQuMTQ9TWFwQ29tcGFyZVBhZ2UKLVJlbGVhc2VXaXphcmQuMTU9Q29uZmlndXJhdGlvbiBGaWxlIENoYW5nZXMKLVJlbGVhc2VXaXphcmQuMTY9UmV2aWV3IGNoYW5nZXMgYXBwbGllZCB0byByZWxlYXNlIGNvbmZpZ3VyYXRpb24gZmlsZXMKLVJlbGVhc2VXaXphcmQuMTc9Q29tbWl0Ci1SZWxlYXNlV2l6YXJkLjE4PUNvbW1pdCBDb21tZW50Ci1SZWxlYXNlV2l6YXJkLjE5PUVudGVyIHRoZSBjb21taXQgY29tbWVudCBmb3IgY2hhbmdlZCBjb25maWd1cmF0aW9uIGZpbGVzCi1SZWxlYXNlV2l6YXJkLjIwPVJlbGVuZyBSZWxlYXNlCi1Qcm9qZWN0U2VsZWN0aW9uUGFnZS4wPVByb2plY3RTZWxlY3Rpb25QYWdlLnNlbGVjdGVkCi1Qcm9qZWN0U2VsZWN0aW9uUGFnZS4xPVByb2plY3RTZWxlY3Rpb25QYWdlLmNvbXBhcmVCdXR0b24KLVByb2plY3RTZWxlY3Rpb25QYWdlLjI9JlNlbGVjdCB0aGUgcHJvamVjdHMgdG8gYmUgcmVsZWFzZQotUHJvamVjdFNlbGVjdGlvblBhZ2UuMz0mUmVsZWFzZSBvbmx5IHByb2plY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHJlbGVhc2UKLVRhZ1BhZ2UuMT1UYWdQYWdlLlRhZwotVGFnUGFnZS4yPVRhZ1BhZ2UuQ29tcGFyZQotVGFnUGFnZS4zPVRhZ1BhZ2UuQ29tbW1pdAotVGFnUGFnZS40PVRhZ1BhZ2UubW92ZQotVGFnUGFnZS41PVRhZ2VQYWdlLnZhbGlkYXRlCi1UYWdQYWdlLjY9VGFnIG5hbWU6Ci1UYWdQYWdlLjc9TW92ZSB0YWcgaWYgaXQgYWxyZWFkeSBleGlzdHMKLVRhZ1BhZ2UuOD1WYWxpZGF0ZSB0aGUgcmVsZWFzZSBvbmNlIGNvbXBsZXRlZAotVGFnUGFnZS45PUZvciBjaGFuZ2VkIHJlbGVhc2UgY29uZmlndXJhdGlvbiBmaWxlcy4uLgotVGFnUGFnZS4xMD1TaG93IHRoZSBmaWxlIGNoYW5nZSBiZWZvcmUgY29tbWl0dGluZwotVGFnUGFnZS4xMT1Db21taXQgdGhlIGZpbGVzIHdpdGhvdXQgc2hvd2luZyBjaGFuZ2VzCi1Qcm9qZWN0Q29tcGFyZURpYWxvZy4wPVRoZSBmb2xsb3dpbmcgcHJvamVjdHMgc3RpbGwgaGF2ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBsb2NhbCBhbmQgcmVsZWFzZWQgY29waWVzCi1SZXBvc2l0b3J5U2VsZWN0aW9uRGlhbG9nLjA9U2VsZWN0IFJlcG9zaXRvcnkgTG9jYXRpb24KLVJlcG9zaXRvcnlTZWxlY3Rpb25EaWFsb2cuMT1TZWxlY3QgdGhlIHJlcG9zaXRvcnkgbG9jYXRpb24gdG8gYmUgdXNlZCBmb3IgdGFnZ2luZwotUHJvamVjdENvbXBhcmVQYWdlLjA9Q2hhbmdlcyBzaW5jZSBsYXN0IHJlbGVhc2UKLVByb2plY3RDb21wYXJlUGFnZS4xPVRoZXJlIHdlcmUgbm8gY2hhbmdlcyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdHMuCi1SZWxFbmdQbHVnaW4uMT1vcmcuZWNsaXBzZS5yZWxlbmcKLVJlbEVuZ1BsdWdpbi4yPW1hcHMKLVJlbEVuZ1BsdWdpbi4zPVJlbEVuZ1BsdWdpblJlc291cmNlcwotUHJvamVjdFZhbGlkYXRpb25EaWFsb2cuMj1Qcm9qZWN0IFZhbGlkYXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3RvYy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnJlbGVuZy50b29scy90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGI0MmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UucmVsZW5nLnRvb2xzL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08dG9jIGxhYmVsPSJSZWxFbmcgVG9vbHMiPgotICAgICAgICA8dG9waWMgbGFiZWw9IlJlbGVhc2UgV2l6YXJkIiBocmVmPSJodG1sLzAwMDI4Lmh0bWwiPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJQcmVsaW1pbmFyeSBDYXNlcyIgaHJlZj0iaHRtbC8wMDAwMC5odG1sIj4KLSAgICAgICAgICAgICAgICA8dG9waWMgbGFiZWw9IlByZUNvbmRpdGlvbiBUZXN0IiBocmVmPSJodG1sLzAwMDcwLmh0bWwiPgotICAgICAgICAgICAgICAgICAgICA8dG9waWMgbGFiZWw9Ik5vIE1hcCBQcm9qZWN0IEV4aXN0cyIgaHJlZj0iaHRtbC8wMDAwMS5odG1sIj4KLSAgICAgICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJObyBNYXAgRmlsZSBFeGlzdHMiIGhyZWY9Imh0bWwvMDAwMDQuaHRtbCI+Ci0gICAgICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iRW1wdHkgTWFwIEZpbGVzIiBocmVmPSJodG1sLzAwMDA1Lmh0bWwiPgotICAgICAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgICAgICAgICA8dG9waWMgbGFiZWw9IlVuc2hhcmVkIE1hcCBQcm9qZWN0IiBocmVmPSJodG1sLzAwMDA2Lmh0bWwiPgotICAgICAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJJbmRpdmlkdWFsIFdpemFyZCBQYWdlIEFuZCBPcHRpb25zIFRlc3QiIGhyZWY9Imh0bWwvMDAwNzEuaHRtbCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iQ2hlY2tib3ggb24gUHJvamVjdCBTZWxlY3Rpb24gUGFnZSIgaHJlZj0iaHRtbC8wMDAxMS5odG1sIj4KLSAgICAgICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJPdXRnb2luZyBDaGFuZ2UgUHJvbXB0aW5nIERpYWxvZyIgaHJlZj0iaHRtbC8wMDAxMi5odG1sIj4KLSAgICAgICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJQcm9qZWN0IENvbXBhcmUgUGFnZSIgaHJlZj0iaHRtbC8wMDAxMy5odG1sIj4KLSAgICAgICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJNb3ZlIFRhZyBPcHRpb24gb24gVGFnIFBhZ2UiIGhyZWY9Imh0bWwvMDAwMTQuaHRtbCI+Ci0gICAgICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iVmFsaWRhdGUgT3B0aW9uIG9uIFRhZyBQYWdlIiBocmVmPSJodG1sLzAwMDE1Lmh0bWwiPgotICAgICAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgICAgICAgICA8dG9waWMgbGFiZWw9IlNob3cgTWFwIEZpbGUgQ2hhbmdlIE9wdGlvbiBvbiBUYWcgcGFnZSIgaHJlZj0iaHRtbC8wMDAxNi5odG1sIj4KLSAgICAgICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJDb21taXQgRGlyZWN0bHkgT3B0aW9uIG9uIFRhZyBQYWdlICIgaHJlZj0iaHRtbC8wMDAxNy5odG1sIj4KLSAgICAgICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJDb21taXQgQ29tbWVudCBQYWdlIiBocmVmPSJodG1sLzAwMDE4Lmh0bWwiPgotICAgICAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJNYXAgRmlsZXMgQW5kIE1hcCBFbnRyaWVzIiBocmVmPSJodG1sLzAwMDcyLmh0bWwiPgotICAgICAgICAgICAgICAgICAgICA8dG9waWMgbGFiZWw9Ik1hcCBFbnRyaWVzIGFuZCBDVlMgTW9kdWxlIE5hbWUiIGhyZWY9Imh0bWwvMDAwMDcuaHRtbCI+Ci0JICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0JICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iTWFwIEVudHJpZXMgQ29udGFpbiBOby1leGlzdGluZyBQcm9qZWN0cyIgaHJlZj0iaHRtbC8wMDAwOC5odG1sIj4KLQkgICAgICAgICAgICAgICAgPC90b3BpYz4KLQkgICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJBZGQvZGVsZXRlIE1hcCBGaWxlIiBocmVmPSJodG1sLzAwMDA5Lmh0bWwiPgotCSAgICAgICAgICAgICAgICA8L3RvcGljPgotCSAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJNYXAgcHJvamVjdCBoYXMgb3RoZXIgdHlwZSBvZiBmaWxlcyIgaHJlZj0iaHRtbC8wMDAxOS5odG1sIj4KLQkgICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iVGFnIFZhbGlkYXRpb24iIGhyZWY9Imh0bWwvMDAwNzMuaHRtbCI+Ci0JICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iVGFnIFZhbGlkYXRpb24iIGhyZWY9Imh0bWwvMDAwMTAuaHRtbCI+Ci0JICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkludGVncmF0ZWQgVGVzdHMgZm9yIERlZmF1bHQgU2V0dGluZ3MiIGhyZWY9Imh0bWwvMDAwMDIuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJBYm91dCBEZWZhdWx0IFNldHRpbmdzIiBocmVmPSJodG1sLzAwMDIwLmh0bWwiPgotICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJBbGwgUHJvamVjdHMgSGF2ZSBObyBPdXRnb2luZyBDaGFuZ2UgIiBocmVmPSJodG1sLzAwMDIxLmh0bWwiPgotICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJBbGwgUHJvamVjdHMgSGF2ZSBPdXRnb2luZyBDaGFuZ2VzIiBocmVmPSJodG1sLzAwMDIyLmh0bWwiPgotICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJTb21lIFByb2plY3RzIEhhdmUgT3V0Z29pbmcgQ2hhbmdlcyIgaHJlZj0iaHRtbC8wMDAyMy5odG1sIj4KLSAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iSW50ZWdyYXRlZCBUZXN0cyBmb3IgVmFyaWF0aW9ucyIgaHJlZj0iaHRtbC8wMDAwMy5odG1sIj4KLSAgICAgICAgICAgICAgICA8dG9waWMgbGFiZWw9IkFib3V0IENvbmZpZ3VyYXRpb24gVmFyaWF0aW9ucyIgaHJlZj0iaHRtbC8wMDAyNC5odG1sIj4KLSAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iQWxsIFByb2plY3RzIEhhdmUgQ2hhbmdlcyBTaW5jZSBMYXN0IFJlbGVhc2UgIiBocmVmPSJodG1sLzAwMDI1Lmh0bWwiPgotICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJTb21lIFByb2plY3RzIEhhdmUgQ2hhbmdlcyBTaW5jZSBMYXN0IFJlbGVhc2UgIiBocmVmPSJodG1sLzAwMDI2Lmh0bWwiPgotICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJNb3ZlIFRhZyBPcHRpb24gRGVzZWxlY3RlZCAvIFNlbGVjdGVkIiBocmVmPSJodG1sLzAwMDI3Lmh0bWwiPgotICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICA8L3RvcGljPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgbGFiZWw9IkNvbXBhcmUgV2l0aCBSZWxlYXNlZCIgaHJlZj0iaHRtbC8wMDAzMC5odG1sIj4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iT25lIFByb2plY3QgQ2FzZSIgaHJlZj0iaHRtbC8wMDA2MS5odG1sIj4KLSAgICAgICAgICAgICAgICA8dG9waWMgbGFiZWw9Ik9uZSBQcm9qZWN0IFdpdGhvdXQgQ2hhbmdlIiBocmVmPSJodG1sLzAwMDMyLmh0bWwiPgotICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJPbmUgUHJvamVjdCBXaXRoIENoYW5nZXMiIGhyZWY9Imh0bWwvMDAwMzMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9Ik11bHRpcGxlIFByb2plY3RzIENhc2UiIGhyZWY9Imh0bWwvMDAwNjIuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJNdWx0aXBsZSBQcm9qZWN0cyBXaXRob3V0IENoYW5nZSIgaHJlZj0iaHRtbC8wMDAzNS5odG1sIj4KLSAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iTXVsdGlwbGUgUHJvamVjdHMgV2l0aCBPdXRnb2luZyBDaGFuZ2VzIiBocmVmPSJodG1sLzAwMDM2Lmh0bWwiPgotICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJDb21wYXJlIEZpbGUgT3IgRm9sZGVyIiBocmVmPSJodG1sLzAwMDYzLmh0bWwiPgotICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iQ29tcGFyZSBhIEZpbGUiIGhyZWY9Imh0bWwvMDAwMzcuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgICAgICA8dG9waWMgbGFiZWw9IkNvbXBhcmUgQSBGb2xkZXIiIGhyZWY9Imh0bWwvMDAwMzguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBsYWJlbD0iUmVwbGFjZSBXaXRoIFJlbGVhc2VkIiBocmVmPSJodG1sLzAwMDMxLmh0bWwiPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJSZXBsYWNlIE9uZSBQcm9qZWN0IiBocmVmPSJodG1sLzAwMDY0Lmh0bWwiPgotICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iT25lIFByb2plY3QgV2l0aG91dCBDaGFuZ2UiIGhyZWY9Imh0bWwvMDAwNDMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgICAgICA8dG9waWMgbGFiZWw9Ik9uZSBwcm9qZWN0IFdpdGggT3V0Z29pbmcgQ2hhbmdlIiBocmVmPSJodG1sLzAwMDM5Lmh0bWwiPgotICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJPbmUgUHJvamVjdCBXaXRoIE91dGdvaW5nIEFkZHRpb24iIGhyZWY9Imh0bWwvMDAwNDEuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgICAgICA8dG9waWMgbGFiZWw9Ik9uZSBQcm9qZWN0IFdpdGggT3V0Z29pbmcgRGVsZXRpb24iIGhyZWY9Imh0bWwvMDAwNDIuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IlJlcGxhY2UgTXVsdGlwbGUgUHJvamVjdHMiIGhyZWY9Imh0bWwvMDAwNjUuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJNdWx0aXBsZSBQcm9qZWN0cyIgaHJlZj0iaHRtbC8wMDA0NC5odG1sIj4KLSAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iUmVwbGFjZSBBIEZpbGUgT3IgQSBGb2xkZXIiIGhyZWY9Imh0bWwvMDAwNjYuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJSZXBsYWNlIEEgRmlsZSIgaHJlZj0iaHRtbC8wMDA0NS5odG1sIj4KLSAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iUmVwbGFjZSBBIEZvbGRlciIgaHJlZj0iaHRtbC8wMDA0Ni5odG1sIj4KLSAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGxhYmVsPSJMb2FkIE1hcCBQcm9qZWN0cyIgaHJlZj0iaHRtbC8wMDA0Ny5odG1sIj4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iU2luZ2xlIE1hcCBGaWxlIEFuZCBWYWxpZCBFbnRyaWVzIiBocmVmPSJodG1sLzAwMDY3Lmh0bWwiPgotICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iUHJvamVjdCBEb2VzIE5vdCBFeGlzdCBJbiBMb2NhbCBXb3JrU3BhY2UiIGhyZWY9Imh0bWwvMDAwNTcuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgICAgICA8dG9waWMgbGFiZWw9IlByb2plY3QgRXhpc3RzIGluIExvY2FsIFdvcmtTcGFjZSIgaHJlZj0iaHRtbC8wMDA1OC5odG1sIj4KLSAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iTWFwIENvbnRhaW5zIEEgT2xkZXIgVGFnIE5hbWUiIGhyZWY9Imh0bWwvMDAwNTkuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgICAgICA8dG9waWMgbGFiZWw9IlByb2plY3QgVXNpbmcgQ1ZTIE1vZHVsZSBOYW1lIiBocmVmPSJodG1sLzAwMDYwLmh0bWwiPgotICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJTaW5nbGUgTWFwIEZpbGUgQW5kIEludmFsaWQgRW50cmllcyIgaHJlZj0iaHRtbC8wMDA2OC5odG1sIj4KLSAgICAgICAgICAgICAgICA8dG9waWMgbGFiZWw9Ik1hcCBGaWxlIENvbnRhaW5zIFVuZXhpc3RpbmcgUHJvamVjdCIgaHJlZj0iaHRtbC8wMDA1NC5odG1sIj4KLSAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iTWFwIEZpbGUgQ290YWlucyBVbmV4aXN0aW5nIFRhZyIgaHJlZj0iaHRtbC8wMDA1Ni5odG1sIj4KLSAgICAgICAgICAgICAgICA8L3RvcGljPgotICAgICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iTXVsdGlwbGUgTWFwIEZpbGVzIiBocmVmPSJodG1sLzAwMDY5Lmh0bWwiPgotICAgICAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iU2VsZWN0IE11bHRpcGxlIE1hcCBGaWxlcyB0byBMb2FkIiBocmVmPSJodG1sLzAwMDU1Lmh0bWwiPgotICAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICA8L3RvcGljPgotICAgICAgICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDVjOGRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjQxMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4yMHRoIEp1bmUsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzL2Fib3V0LmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMvYWJvdXQubWFwcGluZ3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9hYm91dC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkZmE4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUVjbGlwc2UgU0RLIEV4YW1wbGVzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDQuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzY3OTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzPVwKLWFib3V0Lmh0bWwsXAotYWJvdXQuaW5pLFwKLWFib3V0Lm1hcHBpbmdzLFwKLWFib3V0LnByb3BlcnRpZXMsXAotZWNsaXBzZTMyLmdpZixcCi1wbHVnaW4ueG1sLFwKLXBsdWdpbi5wcm9wZXJ0aWVzCi0KLSMgbm90ZTogdGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgaW50ZW50aW9uYWxseSBub3QgbGlzdGVkIGluIGJpbi5pbmNsdWRlcwotIyAgICBjcGwtdjEwLmh0bWwKLSMgICAgbm90aWNlLmh0bWwKLSMgdGhlc2UgZmlsZXMgbmVlZCB0byBlbmQgdXAgYXMgcm9vdCBmaWxlcyBpbiA8aW5zdGFsbD4vZWNsaXBzZS8KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9jcGwtdjEwLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9jcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWEyMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KLQotCi08UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KLTxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9lY2xpcHNlMzIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMvZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxYThmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMvbm90aWNlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9ub3RpY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkODUwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9ub3RpY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD4xNTxzdXA+dGg8L3N1cD4gSnVuZSwgMjAwNDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLSAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KLSAgCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0gIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiODBiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUVjbGlwc2UgU0RLIEV4YW1wbGVzCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzZmYzQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnNkay5leGFtcGxlcyIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgdmVyc2lvbj0iMy4wLjEiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPHJ1bnRpbWU+Ci0gICA8L3J1bnRpbWU+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI3OTRiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnNkay50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGI0MTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MjB0aCBKdW5lLCAyMDAyPC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Db250cmlidXRpb25zPC9oMz4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIENQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9hYm91dC5pbmkgYi9idW5kbGVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZDg0MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9hYm91dC5tYXBwaW5ncyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2Fib3V0LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWJkNmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RWNsaXBzZSBTREsgVGVzdHNcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2UKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyN2E2MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXM9XAotYWJvdXQuaHRtbCxcCi1hYm91dC5pbmksXAotYWJvdXQubWFwcGluZ3MsXAotYWJvdXQucHJvcGVydGllcyxcCi1lY2xpcHNlMzIuZ2lmLFwKLXBsdWdpbi54bWwsXAotcGx1Z2luLnByb3BlcnRpZXMKLQotCi0jIG5vdGU6IHRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGludGVudGlvbmFsbHkgbm90IGxpc3RlZCBpbiBiaW4uaW5jbHVkZXMKLSMgICAgY3BsLXYxMC5odG1sCi0jICAgIG5vdGljZS5odG1sCi0jIHRoZXNlIGZpbGVzIG5lZWQgdG8gZW5kIHVwIGFzIHJvb3QgZmlsZXMgaW4gPGluc3RhbGw+L2VjbGlwc2UvCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2NwbC12MTAuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhYTIwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2VjbGlwc2UzMi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzFhOGY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9ub3RpY2UuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL25vdGljZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Q4NTAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL25vdGljZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPjE1PHN1cD50aDwvc3VwPiBKdW5lLCAyMDA0PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgotICAKLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLSAgCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDMzMTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9RWNsaXBzZSBTREsgVGVzdHMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OGUyNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgaWQ9Im9yZy5lY2xpcHNlLnNkay50ZXN0cyIKLSAgIHZlcnNpb249IjMuMC4xIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS50ZXN0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS50ZXN0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3QvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3QvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3QvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5N2VhNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS50ZXN0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UudGVzdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuYXBhY2hlLmFudDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuYW50LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuaGVscDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamZhY2U8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpmYWNlLnRleHQ8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnN3dDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkud29ya2JlbmNoPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmp1bml0PC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3QvSlVOSVQuWFNMIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS50ZXN0L0pVTklULlhTTApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzMjY1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3QvSlVOSVQuWFNMCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldAl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiLz4KLTx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIgLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyI+Ci0JPEhUTUw+Ci0JCTxIRUFEPgotICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gICAgICBib2R5IHsKLSAgICAgIAlmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgICAJY29sb3I6IzAwMDAwMDsKLSAgICAgIH0KLSAgICAgIHRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7Ci0gICAgICAgICAgZm9udC1zaXplOiA2OCU7Ci0gICAgICB9Ci0gICAgICB0YWJsZS5kZXRhaWxzIHRyIHRoewotICAgICAgCWZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgCXRleHQtYWxpZ246bGVmdDsKLSAgICAgIAliYWNrZ3JvdW5kOiNhNmNhZjA7Ci0gICAgICB9Ci0gICAgICB0YWJsZS5kZXRhaWxzIHRyIHRkewotICAgICAgCWJhY2tncm91bmQ6I2VlZWVlMDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcCB7Ci0gICAgICAJbGluZS1oZWlnaHQ6MS41ZW07Ci0gICAgICAJbWFyZ2luLXRvcDowLjVlbTsgbWFyZ2luLWJvdHRvbToxLjBlbTsKLSAgICAgIH0KLSAgICAgIGgxIHsKLSAgICAgIAltYXJnaW46IDBweCAwcHggNXB4OyBmb250OiAxNjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi0gICAgICB9Ci0gICAgICBoMiB7Ci0gICAgICAJbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi0gICAgICB9Ci0gICAgICBoMyB7Ci0gICAgICAJbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotICAgICAgfQotICAgICAgaDQgewotICAgICAgCW1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLSAgICAgIH0KLSAgICAgIGg1IHsKLSAgICAgIAltYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi0gICAgICB9Ci0gICAgICBoNiB7Ci0gICAgICAJbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotICAgICAgfQotICAgICAgLkVycm9yIHsKLSAgICAgIAlmb250LXdlaWdodDpib2xkOyBjb2xvcjpyZWQ7Ci0gICAgICB9Ci0gICAgICAuRmFpbHVyZSB7Ci0gICAgICAJZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cHVycGxlOwotICAgICAgfQotICAgICAgLlByb3BlcnRpZXMgewotICAgICAgCXRleHQtYWxpZ246cmlnaHQ7Ci0gICAgICB9Ci0gICAgICA8L3N0eWxlPgotICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0gICAgICAgIHZhciBUZXN0Q2FzZXMgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgdmFyIGN1cjsKLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vdGVzdHN1aXRlIj4gICAgICAKLSAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icHJvcGVydGllcyIvPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgIDwvc2NyaXB0PgotICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwhW0NEQVRBWwotICAgICAgICBmdW5jdGlvbiBkaXNwbGF5UHJvcGVydGllcyAobmFtZSkgewotICAgICAgICAgIHZhciB3aW4gPSB3aW5kb3cub3BlbignJywnSlVuaXRTeXN0ZW1Qcm9wZXJ0aWVzJywnc2Nyb2xsYmFycz0xLHJlc2l6YWJsZT0xJyk7Ci0gICAgICAgICAgdmFyIGRvYyA9IHdpbi5kb2N1bWVudC5vcGVuKCk7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8aHRtbD48aGVhZD48dGl0bGU+UHJvcGVydGllcyBvZiAiICsgbmFtZSArICI8L3RpdGxlPiIpOwotICAgICAgICAgIGRvYy53cml0ZSgiPHN0eWxlPiIpCi0gICAgICAgICAgZG9jLndyaXRlKCJib2R5IHtmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7CWNvbG9yOiMwMDAwMDA7IH0iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7IGZvbnQtc2l6ZTogNjglOyB9Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyBib3JkZXItbGVmdDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci10b3A6c29saWQgMSAjY2NjY2NjOyBwYWRkaW5nOjVweDsgfSIpOwotICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0aCB7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2VlZWVlZTsgfSIpOwotICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0ZCB7IGZvbnQ6bm9ybWFsOyB0ZXh0LWFsaWduOmxlZnQ7IGJvcmRlci1yaWdodDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci1ib3R0b206c29saWQgMSAjY2NjY2NjOyBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmZmOyB9Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCJoMyB7IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EgfSIpOwotICAgICAgICAgIGRvYy53cml0ZSgiPC9zdHlsZT4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjwvaGVhZD48Ym9keT4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjxoMz5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvaDM+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8ZGl2IGFsaWduPVwicmlnaHRcIj48YSBocmVmPVwiamF2YXNjcmlwdDp3aW5kb3cuY2xvc2UoKTtcIj5DbG9zZTwvYT48L2Rpdj4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjx0YWJsZSBjbGFzcz0ncHJvcGVydGllcyc+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8dHI+PHRoPk5hbWU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iKTsKLSAgICAgICAgICBmb3IgKHByb3AgaW4gVGVzdENhc2VzW25hbWVdKSB7Ci0gICAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+IiArIHByb3AgKyAiPC90aD48dGQ+IiArIFRlc3RDYXNlc1tuYW1lXVtwcm9wXSArICI8L3RkPjwvdHI+Iik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRvYy53cml0ZSgiPC90YWJsZT4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjwvYm9keT48L2h0bWw+Iik7Ci0gICAgICAgICAgZG9jLmNsb3NlKCk7Ci0gICAgICAgICAgd2luLmZvY3VzKCk7Ci0gICAgICAgIH0KLSAgICAgIF1dPiAgCi0gICAgICA8L3NjcmlwdD4KLQkJPC9IRUFEPgotCQk8Ym9keT4KLQkJCTxhIG5hbWU9InRvcCI+PC9hPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4JCi0JCQkKLQkJCTwhLS0gU3VtbWFyeSBwYXJ0IC0tPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN1bW1hcnkiLz4KLQkJCTxociBzaXplPSIxIiB3aWR0aD0iOTUlIiBhbGlnbj0ibGVmdCIvPgotCQkJCi0JCQk8IS0tIFBhY2thZ2UgTGlzdCBwYXJ0IC0tPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2VsaXN0Ii8+Ci0JCQk8aHIgc2l6ZT0iMSIgd2lkdGg9Ijk1JSIgYWxpZ249ImxlZnQiLz4KLQkJCQotCQkJPCEtLSBGb3IgZWFjaCBwYWNrYWdlIGNyZWF0ZSBpdHMgcGFydCAtLT4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlcyIvPgotCQkJPGhyIHNpemU9IjEiIHdpZHRoPSI5NSUiIGFsaWduPSJsZWZ0Ii8+Ci0JCQkKLQkJCTwhLS0gRm9yIGVhY2ggY2xhc3MgY3JlYXRlIHRoZSAgcGFydCAtLT4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzc2VzIi8+Ci0JCQkKLQkJPC9ib2R5PgotCTwvSFRNTD4KLTwveHNsOnRlbXBsYXRlPgotCQotCQotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gV3JpdGUgYSBsaXN0IG9mIGFsbCBwYWNrYWdlcyB3aXRoIGFuIGh5cGVybGluayB0byB0aGUgYW5jaG9yIG9mICAgIC0tPgotCTwhLS0gb2YgdGhlIHBhY2thZ2UgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZWxpc3QiPgkKLQkJPGgyPlBhY2thZ2VzPC9oMj4KLQkJTm90ZTogcGFja2FnZSBzdGF0aXN0aWNzIGFyZSBub3QgY29tcHV0ZWQgcmVjdXJzaXZlbHksIHRoZXkgb25seSBzdW0gdXAgYWxsIG9mIGl0cyB0ZXN0c3VpdGVzIG51bWJlcnMuCi0JCTx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgotCQkJPCEtLSBsaXN0IGFsbCBwYWNrYWdlcyByZWN1cnNpdmVseSAtLT4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuL3Rlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSI+Ci0JCQkJPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiLz4KLQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RzdWl0ZXMtaW4tcGFja2FnZSIgc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbLi9AcGFja2FnZSA9IGN1cnJlbnQoKS9AcGFja2FnZV0iLz4KLQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RDb3VudCIgc2VsZWN0PSJzdW0oJHRlc3RzdWl0ZXMtaW4tcGFja2FnZS9AdGVzdHMpIi8+Ci0JCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlcnJvckNvdW50IiBzZWxlY3Q9InN1bSgkdGVzdHN1aXRlcy1pbi1wYWNrYWdlL0BlcnJvcnMpIi8+Ci0JCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJmYWlsdXJlQ291bnQiIHNlbGVjdD0ic3VtKCR0ZXN0c3VpdGVzLWluLXBhY2thZ2UvQGZhaWx1cmVzKSIvPgotCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0idGltZUNvdW50IiBzZWxlY3Q9InN1bSgkdGVzdHN1aXRlcy1pbi1wYWNrYWdlL0B0aW1lKSIvPgotCQkJCQotCQkJCTwhLS0gd3JpdGUgYSBzdW1tYXJ5IGZvciB0aGUgcGFja2FnZSAtLT4KLQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQk8IS0tIHNldCBhIG5pY2UgY29sb3IgZGVwZW5kaW5nIGlmIHRoZXJlIGlzIGFuIGVycm9yL2ZhaWx1cmUgLS0+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZmFpbHVyZUNvdW50ICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+Ci0JCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlcnJvckNvdW50ICZndDsgMCI+RXJyb3I8L3hzbDp3aGVuPgotCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQk8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx0ZD48YSBocmVmPSIje0BwYWNrYWdlfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+PC9hPjwvdGQ+Ci0JCQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlc3RDb3VudCIvPjwvdGQ+Ci0JCQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVycm9yQ291bnQiLz48L3RkPgotCQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmYWlsdXJlQ291bnQiLz48L3RkPgotCQkJCQk8dGQ+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiR0aW1lQ291bnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwvdGFibGU+CQkKLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFdyaXRlIGEgcGFja2FnZSBsZXZlbCByZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEl0IGNyZWF0ZXMgYSB0YWJsZSB3aXRoIHZhbHVlcyBmcm9tIHRoZSBkb2N1bWVudDogICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIE5hbWUgfCBUZXN0cyB8IEVycm9ycyB8IEZhaWx1cmVzIHwgVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InBhY2thZ2VzIj4KLQkJPCEtLSBjcmVhdGUgYW4gYW5jaG9yIHRvIHRoaXMgcGFja2FnZSBuYW1lIC0tPgotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KLQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0JCQkJPGEgbmFtZT0ie0BwYWNrYWdlfSI+PC9hPgotCQkJCTxoMz5QYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjwvaDM+Ci0JCQkJCi0JCQkJPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0c3VpdGUudGVzdC5oZWFkZXIiLz4KLQkJCQotCQkJCQk8IS0tIG1hdGNoIHRoZSB0ZXN0c3VpdGVzIG9mIHRoaXMgcGFja2FnZSAtLT4KLQkJCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbLi9AcGFja2FnZSA9IGN1cnJlbnQoKS9AcGFja2FnZV0iIG1vZGU9InByaW50LnRlc3QiLz4KLQkJCQk8L3RhYmxlPgotCQkJCTxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gdG9wPC9hPgotCQkJCTxwLz4KLQkJCQk8cC8+Ci0JCTwveHNsOmZvci1lYWNoPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iY2xhc3NlcyI+Ci0JCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJ0ZXN0c3VpdGUiPgotCQkJPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLQkJCTwhLS0gY3JlYXRlIGFuIGFuY2hvciB0byB0aGlzIGNsYXNzIG5hbWUgLS0+Ci0JCQk8YSBuYW1lPSJ7QG5hbWV9Ij48L2E+Ci0JCQk8aDM+VGVzdENhc2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9oMz4KLQkJCQotCQkJPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0JCQkgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0Y2FzZS50ZXN0LmhlYWRlciIvPgotCQkJICA8IS0tCi0JCQkgIHRlc3QgY2FuIGV2ZW4gbm90IGJlIHN0YXJ0ZWQgYXQgYWxsIChmYWlsdXJlIHRvIGxvYWQgdGhlIGNsYXNzKQotCQkJICBzbyByZXBvcnQgdGhlIGVycm9yIGRpcmVjdGx5Ci0JCQkgIC0tPgotCQkJCTx4c2w6aWYgdGVzdD0iLi9lcnJvciI+Ci0JCQkJCTx0ciBjbGFzcz0iRXJyb3IiPgotCQkJCQkJPHRkIGNvbHNwYW49IjQiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9lcnJvciIvPjwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3Rlc3RjYXNlIiBtb2RlPSJwcmludC50ZXN0Ii8+Ci0JCQk8L3RhYmxlPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+Ci0gICAgICAgICAgICAgICAgPGE+Ci0JCQkgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmphdmFzY3JpcHQ6ZGlzcGxheVByb3BlcnRpZXMoJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4nKTs8L3hzbDphdHRyaWJ1dGU+Ci0JCQkgICAgICAgIFByb3BlcnRpZXMgJmd0OyZndDsKLQkJCSAgICA8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLQkJCTxwLz4KLQkJCQotCQkJPGEgaHJlZj0iI3RvcCI+QmFjayB0byB0b3A8L2E+Ci0JCTwveHNsOmZvci1lYWNoPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ic3VtbWFyeSI+Ci0JCTxoMj5TdW1tYXJ5PC9oMj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0Q291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AdGVzdHMpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXJyb3JDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0BlcnJvcnMpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZmFpbHVyZUNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQGZhaWx1cmVzKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRpbWVDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0B0aW1lKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1Y2Nlc3NSYXRlIiBzZWxlY3Q9IigkdGVzdENvdW50IC0gJGZhaWx1cmVDb3VudCAtICRlcnJvckNvdW50KSBkaXYgJHRlc3RDb3VudCIvPgotCQk8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KLQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCTx0aD5UZXN0czwvdGg+Ci0JCQk8dGg+RmFpbHVyZXM8L3RoPgotCQkJPHRoPkVycm9yczwvdGg+Ci0JCQk8dGg+U3VjY2VzcyByYXRlPC90aD4KLQkJCTx0aD5UaW1lPC90aD4KLQkJPC90cj4KLQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLQkJCQk8eHNsOmNob29zZT4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRmYWlsdXJlQ291bnQgJmd0OyAwIj5GYWlsdXJlPC94c2w6d2hlbj4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlcnJvckNvdW50ICZndDsgMCI+RXJyb3I8L3hzbDp3aGVuPgotCQkJCTwveHNsOmNob29zZT4KLQkJCTwveHNsOmF0dHJpYnV0ZT4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlc3RDb3VudCIvPjwvdGQ+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmYWlsdXJlQ291bnQiLz48L3RkPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXJyb3JDb3VudCIvPjwvdGQ+Ci0JCQk8dGQ+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktcGVyY2VudCI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSIkc3VjY2Vzc1JhdGUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC90ZD4KLQkJCTx0ZD4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiR0aW1lQ291bnQiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC90ZD4KLQotCQk8L3RyPgotCQk8L3RhYmxlPgotCQk8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iOTUlIj4KLQkJPHRyPgotCQk8dGQJc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij4KLQkJTm90ZTogPGk+ZmFpbHVyZXM8L2k+IGFyZSBhbnRpY2lwYXRlZCBhbmQgY2hlY2tlZCBmb3Igd2l0aCBhc3NlcnRpb25zIHdoaWxlIDxpPmVycm9yczwvaT4gYXJlIHVuYW50aWNpcGF0ZWQuCi0JCTwvdGQ+Ci0JCTwvdHI+Ci0JCTwvdGFibGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0gIDwhLS0KLSAgIFdyaXRlIHByb3BlcnRpZXMgaW50byBhIEphdmFTY3JpcHQgZGF0YSBzdHJ1Y3R1cmUuCi0gICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBpZGVhIGJ5IEVyaWsgSGF0Y2hlciAoZXJpa0BoYXRjaGVyLm5ldCkKLSAgIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9wZXJ0aWVzIj4KLSAgICBjdXIgPSBUZXN0Q2FzZXNbJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQG5hbWUiLz4nXSA9IG5ldyBBcnJheSgpOwotICAJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICBjdXJbJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiddID0gJzx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0iQHZhbHVlIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4nOwotICAJPC94c2w6Zm9yLWVhY2g+Ci0gIDwveHNsOnRlbXBsYXRlPgotCQotPCEtLSBQYWdlIEhFQURFUiAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciI+Ci0JPGgxPlVuaXQgVGVzdCBSZXN1bHRzPC9oMT4KLQk8dGFibGUgd2lkdGg9IjEwMCUiPgotCTx0cj4KLQkJPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgotCQk8dGQgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0naHR0cDovL3d3dy5qdW5pdC5vcmcnPkpVbml0PC9hPiBhbmQgPGEgaHJlZj0naHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9hbnQnPkFudDwvYT4uPC90ZD4KLQk8L3RyPgotCTwvdGFibGU+Ci0JPGhyIHNpemU9IjEiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9ImhlYWRlciI+Ci0JPHRyIHZhbGlnbj0idG9wIj4KLQkJPHRoIHdpZHRoPSI4MCUiPk5hbWU8L3RoPgotCQk8dGg+VGVzdHM8L3RoPgotCQk8dGg+RXJyb3JzPC90aD4KLQkJPHRoPkZhaWx1cmVzPC90aD4KLQkJPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lKHMpPC90aD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gY2xhc3MgaGVhZGVyIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZXN0c3VpdGUudGVzdC5oZWFkZXIiPgotCTx0ciB2YWxpZ249InRvcCI+Ci0JCTx0aCB3aWR0aD0iODAlIj5OYW1lPC90aD4KLQkJPHRoPlRlc3RzPC90aD4KLQkJPHRoPkVycm9yczwvdGg+Ci0JCTx0aD5GYWlsdXJlczwvdGg+Ci0JCTx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+Ci0JPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIG1ldGhvZCBoZWFkZXIgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InRlc3RjYXNlLnRlc3QuaGVhZGVyIj4KLQk8dHIgdmFsaWduPSJ0b3AiPgotCQk8dGg+TmFtZTwvdGg+Ci0JCTx0aD5TdGF0dXM8L3RoPgotCQk8dGggd2lkdGg9IjgwJSI+VHlwZTwvdGg+Ci0JCTx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+Ci0JPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gY2xhc3MgaW5mb3JtYXRpb24gLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9InByaW50LnRlc3QiPgotCTx0ciB2YWxpZ249InRvcCI+Ci0JCTwhLS0gc2V0IGEgbmljZSBjb2xvciBkZXBlbmRpbmcgaWYgdGhlcmUgaXMgYW4gZXJyb3IvZmFpbHVyZSAtLT4KLQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9IkBmYWlsdXJlc1suJmd0OyAwXSI+RmFpbHVyZTwveHNsOndoZW4+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9IkBlcnJvcnNbLiZndDsgMF0iPkVycm9yPC94c2w6d2hlbj4KLQkJCTwveHNsOmNob29zZT4KLQkJPC94c2w6YXR0cmlidXRlPgotCQotCQk8IS0tIHByaW50IHRlc3RzdWl0ZSBpbmZvcm1hdGlvbiAtLT4KLQkJPHRkPjxhIGhyZWY9IiN7QG5hbWV9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+PC90ZD4KLQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGVzdHMiLz48L3RkPgotCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBlcnJvcnMiLz48L3RkPgotCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBmYWlsdXJlcyIvPjwvdGQ+Ci0JCTx0ZD4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJAdGltZSIvPgotCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJPC90ZD4KLQk8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RjYXNlIiBtb2RlPSJwcmludC50ZXN0Ij4KLQk8dHIgdmFsaWduPSJ0b3AiPgotCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iZmFpbHVyZSB8IGVycm9yIj5FcnJvcjwveHNsOndoZW4+Ci0JCQk8L3hzbDpjaG9vc2U+Ci0JCTwveHNsOmF0dHJpYnV0ZT4KLQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvdGQ+Ci0JCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPgotCQkJCTx0ZD5GYWlsdXJlPC90ZD4KLQkJCQk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmYWlsdXJlIi8+PC90ZD4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iZXJyb3IiPgotCQkJCTx0ZD5FcnJvcjwvdGQ+Ci0JCQkJPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZXJyb3IiLz48L3RkPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTx0ZD5TdWNjZXNzPC90ZD4KLQkJCQk8dGQ+PC90ZD4KLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJPC94c2w6Y2hvb3NlPgotCQk8dGQ+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iQHRpbWUiLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwvdGQ+Ci0JPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZhaWx1cmUiPgotCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZXJyb3IiPgotCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBTdHlsZSBmb3IgdGhlIGVycm9yIGFuZCBmYWlsdXJlIGluIHRoZSB0ZXNjYXNlIHRlbXBsYXRlIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIj4KLQk8eHNsOmNob29zZT4KLQkJPHhzbDp3aGVuIHRlc3Q9Im5vdChAbWVzc2FnZSkiPk4vQTwveHNsOndoZW4+Ci0JCTx4c2w6b3RoZXJ3aXNlPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXNzYWdlIi8+Ci0JCTwveHNsOm90aGVyd2lzZT4KLQk8L3hzbDpjaG9vc2U+Ci0JPCEtLSBkaXNwbGF5IHRoZSBzdGFja3RyYWNlIC0tPgotCTxjb2RlPgotCQk8cC8+Ci0JCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3b3JkIiBzZWxlY3Q9Ii4iLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQk8L2NvZGU+Ci0JPCEtLSB0aGUgbGF0ZXIgaXMgYmV0dGVyIGJ1dCBtaWdodCBiZSBwcm9ibGVtYXRpYyBmb3Igbm9uLTIxIiBtb25pdG9ycy4uLiAtLT4KLQk8IS0tcHJlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9wcmUtLT4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdHJpbmciLz4KLQk8eHNsOmNob29zZT48IS0tIHNvbWV0aGluZyBpc24ndCByaWdodCBoZXJlLCBiYXNpY2FsbHkgYWxsIHNpbmdsZSBxdW90ZXMgbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGJhY2tzbGFzaC1zaW5nbGUtcXVvdGUKLQkJPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKCRzdHJpbmcsJyZhcG9zOycpIj4KLQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRzdHJpbmcsJyZhcG9zOycpIi8+Ci0JCQlcJmFwb3M7Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSlMtZXNjYXBlIj4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkc3RyaW5nLCcmYXBvczsnKSIvPgotCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJPC94c2w6d2hlbj4gLS0+Ci0JCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucygkc3RyaW5nLCdcJykiPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHN0cmluZywnXCcpIi8+XFw8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSlMtZXNjYXBlIj4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkc3RyaW5nLCdcJykiLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwveHNsOndoZW4+Ci0JCTx4c2w6b3RoZXJ3aXNlPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdHJpbmciLz4KLQkJPC94c2w6b3RoZXJ3aXNlPgotCTwveHNsOmNob29zZT4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0KLQl0ZW1wbGF0ZSB0aGF0IHdpbGwgY29udmVydCBhIGNhcnJpYWdlIHJldHVybiBpbnRvIGEgYnIgdGFnCi0JQHBhcmFtIHdvcmQgdGhlIHRleHQgZnJvbSB3aGljaCB0byBjb252ZXJ0IENSIHRvIEJSIHRhZwotLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPgotCTx4c2w6cGFyYW0gbmFtZT0id29yZCIvPgotCTx4c2w6Y2hvb3NlPgotCQk8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHdvcmQsJyYjeEE7JykiPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHdvcmQsJyYjeEE7JykiLz4KLQkJCTxici8+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndvcmQiIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCR3b3JkLCcmI3hBOycpIi8+Ci0JCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQk8L3hzbDp3aGVuPgotCQk8eHNsOm90aGVyd2lzZT4KLQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29yZCIvPgotCQk8L3hzbDpvdGhlcndpc2U+Ci0JPC94c2w6Y2hvb3NlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLQk8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+Ci0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoJHZhbHVlLCcwLjAwMCcpIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXBlcmNlbnQiPgotCTx4c2w6cGFyYW0gbmFtZT0idmFsdWUiLz4KLQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAlJykiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3QvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjk1ZjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+Mm5kIE9jdG9iZXIsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotCi08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBmb2xsb3dzOjwvcD4KLQotPGI+WGFsYW4gMi4xLjA8L2I+Ci08cD5UaGUgcGx1Zy1pbiBpcyBhY2NvbXBhbmllZCBieSBzb2Z0d2FyZSBiYXNlZCBvbiBYYWxhbiAyLjEuMCBkZXZlbG9wZWQgYnkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFzIHBhcnQgb2YgdGhlIEFwYWNoZSBYTUwgcHJvamVjdC4gIFRoZXJlZm9yZTo8L3A+Ci0KLTxibG9ja3F1b3RlPgotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L2E+KS4KLTwvYmxvY2txdW90ZT4KLQotPHA+VGhlIFhhbGFuIGJpbmFyeSBjb2RlIGlzIGxvY2F0ZWQgaW4geGFsYW4uamFyIGFuZCBpczo8L3A+Ci08YmxvY2txdW90ZT5Db3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvYmxvY2txdW90ZT4KLVlvdXIgdXNlIG9mIFhhbGFuIGluIGJpbmFyeSBjb2RlIGZvcm0gYWNjb21wYW55aW5nIHRoZSBwbHVnLWluIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAKLUFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSB3aGljaCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL0xJQ0VOU0UiPmh0dHA6Ly94bWwuYXBhY2hlLm9yZy9MSUNFTlNFPC9hPi4gIE1vcmUgc3BlY2lmaWNhbGx5OjwvcD4KLTxibG9ja3F1b3RlPgotCTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mPGJyIC8+Ci0JY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLjxiciAvPgotPGJyIC8+Ci0JMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Y8YnIgLz4KLQljb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFsczxiciAvPgotCXByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi48YnIgLz4KLTxiciAvPgotCTMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGU8YnIgLz4KLQlmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6PGJyIC8+Ci0JPGJsb2NrcXVvdGU+Ci0JCSZxdW90O1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPGJyIC8+Ci0JCSg8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC9hPikuJnF1b3Q7Ci0JPC9ibG9ja3F1b3RlPgotCUFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwgaWYgYW5kIHdoZXJldmVyIHN1Y2g8YnIgLz4KLQl0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLjxiciAvPgotPGJyIC8+Ci0JNC4gVGhlIG5hbWVzICZxdW90O1hhbGFuJnF1b3Q7IGFuZCAmcXVvdDtBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiZxdW90OyBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3I8YnIgLz4KLQlwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbjxiciAvPgotCXBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxhIGhyZWY9Im1haWx0bzphcGFjaGVAYXBhY2hlLm9yZyI+YXBhY2hlQGFwYWNoZS5vcmc8L2E+LjxiciAvPgotPGJyIC8+Ci0JNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgJnF1b3Q7QXBhY2hlJnF1b3Q7LCBub3IgbWF5ICZxdW90O0FwYWNoZSZxdW90OyBhcHBlYXI8YnIgLz4KLQlpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uPGJyIC8+Ci08YnIgLz4KLQlUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICZxdW90O0FTIElTJnF1b3Q7IEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UPGJyIC8+Ci0JTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUjxiciAvPgotCVBVUlBPU0UgQVJFCURJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IgSVRTPGJyIC8+Ci0JQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1I8YnIgLz4KLQlDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SPGJyIC8+Ci0JU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTjxiciAvPgotCUFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAlPUiBUT1JUIChJTkNMVURJTkc8YnIgLz4KLQlORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAlPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUY8YnIgLz4KLQlBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLTwvYmxvY2txdW90ZT4KLQotPHA+U291cmNlIGNvZGUgZm9yIFhhbGFuIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai9pbmRleC5odG1sIj5odHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai9pbmRleC5odG1sPC9hPi48cD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3QvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjc2YTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS5hdXRvbWF0ZWQuamFyID1zcmMvCi1iaW4uaW5jbHVkZXM9Ki5qYXIsKi54c2wsbGlicmFyeS54bWwscGx1Z2luLnhtbCxkb2MvLHJ1bnRlc3RzKix0ZXN0LnhtbCwqLmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9saWJyYXJ5LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9saWJyYXJ5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhNGU3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9IkxpYnJhcnkiIGRlZmF1bHQ9ImluaXQiIGJhc2VkaXI9Ii4iPgotCi0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY29yZS10ZXN0Ij4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImVjbGlwc2UtdGVzdCI+Ci0gICAgICA8cGFyYW0gbmFtZT0iYXBwbGljYXRpb24iIHZhbHVlPSJvcmcuZWNsaXBzZS50ZXN0LmNvcmV0ZXN0YXBwbGljYXRpb24iLz4KLSAgICA8L2FudGNhbGw+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idWktdGVzdCI+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJlY2xpcHNlLXRlc3QiPgotICAgICAgPHBhcmFtIG5hbWU9ImFwcGxpY2F0aW9uIiB2YWx1ZT0ib3JnLmVjbGlwc2UudGVzdC51aXRlc3RhcHBsaWNhdGlvbiIvPgotICAgIDwvYW50Y2FsbD4KLSAgPC90YXJnZXQ+Ci0gIAotCQotICA8dGFyZ2V0IG5hbWU9ImVjbGlwc2UtdGVzdCI+Ci0gICAgPHRzdGFtcD4KLSAgICAgICAgPGZvcm1hdCBwcm9wZXJ0eT0iVElNRU5PVyIgcGF0dGVybj0iSEhtbXNzU1NTUyIvPgotICAgIDwvdHN0YW1wPgotCi0gICAgPHByb3BlcnR5IG5hbWU9InZtYXJncyIgdmFsdWU9IiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJsYXVuY2hlciIgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXIuTWFpbiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXR0ZXIiIHZhbHVlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5YTUxKVW5pdFJlc3VsdEZvcm1hdHRlciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiIvPgotCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiIgLz4KLQk8cHJvcGVydHkgbmFtZT0idGltZW91dCIgdmFsdWU9IjM2MDAwMDAiIC8+Ci0gIAkKLSAgCTwhLS1ydW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgdGFyZ2V0cyBkZXBlbmRpbmcgb24gdGhlIHNldHRpbmcgb2YgdGhlIEFudCBwcm9wZXJ0eSwgcGVyZm9ybWFuY2UtLT4KLQk8YW50Y2FsbCB0YXJnZXQ9Imp1bml0IiAvPgotCTxhbnRjYWxsIHRhcmdldD0icGVyZm9ybWFuY2UiIC8+Ci0gIDwvdGFyZ2V0PgotCQotICA8dGFyZ2V0IG5hbWU9Imp1bml0IiB1bmxlc3M9InBlcmZvcm1hbmNlIj4KLTwhLS0gCi1QYXJhbWV0ZXJzIHRvIHRoaXMgdGFyZ2V0OgotZGF0YS1kaXIJCS0gdGhlIGRpcmVjdG9yeSBmb3IgRWNsaXBzZSB0byB3cml0ZSBpdHMgZGF0YQotcGx1Z2luLW5hbWUJCS0gdGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0byB0ZXN0Ci1jbGFzc25hbWUJCS0gdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2xhc3MKLXZtYXJncwkJCS0gYSBzdHJpbmcgY29udGFpbmluZyBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgVk0gLSBkZWZhdWx0cyB0byAiIgotLS0+Ci0JCi0JPGVjaG8gbWVzc2FnZT0iUnVubmluZyAke2NsYXNzbmFtZX0iLz4KLQotICAgIDwhLS0gUHJvZHVjZXMgdGhlIGZpbGUgJyR7ZGVmYXVsdC1maWxlbmFtZX0nIC0tPgotICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtsYXVuY2hlcn0iIGZvcms9InRydWUiIGRpcj0iLiIgdGltZW91dD0iJHt0aW1lb3V0fSI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InN0YXJ0dXAuamFyIi8+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxhcmcgbGluZT0iLWFwcGxpY2F0aW9uICR7YXBwbGljYXRpb259Ii8+Ci0gICAgICA8YXJnIGxpbmU9Ii1kZXYgYmluIC1kYXRhICR7ZGF0YS1kaXJ9Ii8+Ci0gICAgICA8YXJnIGxpbmU9ImZvcm1hdHRlcj0ke2Zvcm1hdHRlcn0sJHtjbGFzc25hbWV9LnhtbCIvPgotICAgICAgPGFyZyBsaW5lPSItdGVzdFBsdWdpbk5hbWUgJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxhcmcgbGluZT0iLWNsYXNzTmFtZSAke2NsYXNzbmFtZX0iLz4KLSAgICAgIDxhcmcgbGluZT0iLW9zICR7b3N9Ii8+Ci0gICAgICA8YXJnIGxpbmU9Ii13cyAke3dzfSIvPgotICAgICAgPGFyZyBsaW5lPSItYXJjaCAke2FyY2h9Ii8+Ci0gICAgICA8anZtYXJnIGxpbmU9IiR7dm1hcmdzfSAke2V4dHJhVk1hcmdzfSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iUExVR0lOX1BBVEgiIHZhbHVlPSIke3BsdWdpbi1wYXRofSIvPiAKLSAgICAgPC9qYXZhPgotCi0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2UiIGlmPSJwZXJmb3JtYW5jZSI+Ci0JPCEtLSAKLQlQYXJhbWV0ZXJzIHRvIHRoaXMgdGFyZ2V0OgotCWRhdGEtZGlyCQktIHRoZSBkaXJlY3RvcnkgZm9yIEVjbGlwc2UgdG8gd3JpdGUgaXRzIGRhdGEKLQlwbHVnaW4tbmFtZQkJLSB0aGUgbmFtZSBvZiB0aGUgcGx1Z2luIHRvIHRlc3QKLQljbGFzc25hbWUJCS0gdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2xhc3MKLQl2bWFyZ3MJCQktIGEgc3RyaW5nIGNvbnRhaW5pbmcgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIFZNIC0gZGVmYXVsdHMgdG8gIiIKLQktLT4KLSAgCQk8IS0tTG9hZCB2YWx1ZSBmb3IgZWNsaXBzZS5idWlsZElkIGZyb20gdGhlIGNvbmZpZy5pbmkgZmlsZS0tPgotIAkJPHByb3BlcnR5IGZpbGU9IiR7ZWNsaXBzZS1ob21lfS9jb25maWd1cmF0aW9uL2NvbmZpZy5pbmkiIC8+Ci0JICAgIDxwcm9wZXJ0eSBuYW1lPSJldG9vbHNfcGVyZl9jdHJsIiB2YWx1ZT0idGVzdG5hbWU9JHtjbGFzc25hbWV9O2xvZz0ke2VjbGlwc2UtaG9tZX07ZHJpdmVyPSR7ZWNsaXBzZS5idWlsZElkfTtkcml2ZXJkYXRlPSR7dGltZXN0YW1wfTtkcml2ZXJzdHJlYW09My4wLjA7ZHJpdmVybGFiZWw9JHtlY2xpcHNlLmJ1aWxkSWR9O3VwbG9hZGhvc3Q9JHtwZXJmLmhvc3R9O3VwbG9hZHBvcnQ9JHtwZXJmLnBvcnR9O3VwbG9hZHVzZXJpZD0ke3BlcmYuaWR9IiAvPgotCSAgCQotCSAgICA8ZWNobyBtZXNzYWdlPSJSdW5uaW5nICR7Y2xhc3NuYW1lfSIvPgotCi0JICAgIDwhLS0gUHJvZHVjZXMgdGhlIGZpbGUgJyR7ZGVmYXVsdC1maWxlbmFtZX0nIC0tPgotCSAgICA8amF2YSBjbGFzc25hbWU9IiR7bGF1bmNoZXJ9IiBmb3JrPSJ0cnVlIiBkaXI9Ii4iIHRpbWVvdXQ9IiR7dGltZW91dH0iPgotCSAgICAgIDxjbGFzc3BhdGg+Ci0JICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InN0YXJ0dXAuamFyIi8+Ci0JICAgICAgPC9jbGFzc3BhdGg+Ci0JICAgICAgPGFyZyBsaW5lPSItYXBwbGljYXRpb24gJHthcHBsaWNhdGlvbn0iLz4KLQkgICAgICA8YXJnIGxpbmU9Ii1kZXYgYmluIC1kYXRhICR7ZGF0YS1kaXJ9Ii8+Ci0JICAgICAgPGFyZyBsaW5lPSJmb3JtYXR0ZXI9JHtmb3JtYXR0ZXJ9LCR7Y2xhc3NuYW1lfS54bWwiLz4KLQkgICAgICA8YXJnIGxpbmU9Ii10ZXN0UGx1Z2luTmFtZSAke3BsdWdpbi1uYW1lfSIvPgotCSAgICAgIDxhcmcgbGluZT0iLWNsYXNzTmFtZSAke2NsYXNzbmFtZX0iLz4KLQkgICAgICA8YXJnIGxpbmU9Ii1vcyAke29zfSIvPgotCSAgICAgIDxhcmcgbGluZT0iLXdzICR7d3N9Ii8+Ci0JICAgICAgPGFyZyBsaW5lPSItYXJjaCAke2FyY2h9Ii8+Ci0JICAgICAgPGp2bWFyZyBsaW5lPSIke3ZtYXJnc30gJHtleHRyYVZNYXJnc30iLz4KLQkgICAgICA8c3lzcHJvcGVydHkga2V5PSJQTFVHSU5fUEFUSCIgdmFsdWU9IiR7cGx1Z2luLXBhdGh9Ii8+IAotCSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImV0b29sc19wZXJmX2N0cmwiIHZhbHVlPSIke2V0b29sc19wZXJmX2N0cmx9Ii8+IAotCSAgICA8L2phdmE+Ci0KLSAgPC90YXJnZXQ+Ci0JCi0gIDx0YXJnZXQgbmFtZT0iY29sbGVjdCI+Ci08IS0tIAotUGFyYW1ldGVycyB0byB0aGlzIHRhcmdldDoKLWluY2x1ZGVzCQktIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgdG8gaW5jbHVkZQotb3V0cHV0LWZpbGUJCS0gdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIHRvIHByb2R1Y2UKLS0tPgotICAgIDxqdW5pdHJlcG9ydCB0b2Rpcj0iLiIgdG9maWxlPSIke291dHB1dC1maWxlfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9Ii4iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2luY2x1ZGVzfSIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvanVuaXRyZXBvcnQ+Ci0gIDwvdGFyZ2V0PgotCi08IS0tIAotV0FSTklORzogVGhpcyB0YXNrIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IHVudGlsIG9yZy5lY2xpcHNlLmFudC5jb3JlCi0gICAgICAgICB1cGdyYWRlcyB0byBBbnQgMS40IG9yIGhpZ2hlci4gVGhlcmUgYXJlIHByb2JsZW1zIHdpdGggYWJzb2x1dGUKLSAgICAgICAgIHBhdGhzIGFuZCB0aGUgc3R5bGUgdGFzay4KLS0tPgotICA8dGFyZ2V0IG5hbWU9InRlc3QtcmVncmVzc2lvbnMiPgotPCEtLQotUGFyYW1ldGVycyB0byB0aGlzIHRhcmdldDoKLW9sZGZpbGUJCQktIHRoZSBuYW1lIG9mIHRoZSBiYXNlbGluZSBYTUwgZmlsZSB0byB0ZXN0IGFnYWluc3QKLW5ld2ZpbGUJCQktIHRoZSBuYW1lIG9mIHRoZSBYTUwgZmlsZSBjb250YWluaW5nIG1vc3QgcmVjZW50IHRlc3QgcmVzdWx0cwotb3V0ZmlsZQkJCS0gdGhlIG5hbWUgb2YgdGhlIGZpbGUgcHJvZHVjZWQKLS0tPgotCi0gICAgPGVjaG8gbWVzc2FnZT0iUnVubmluZyBSZWdyZXNzaW9uIFRlc3RzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRlc3QtcGx1Z2luLWRpciIgdmFsdWU9IiR7YmFzZWRpcn0vZnJhZ21lbnRzL29yZy5lY2xpcHNlLnRlc3QiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icnQtc3R5bGVzaGVldCIgdmFsdWU9IiR7dGVzdC1wbHVnaW4tZGlyfS9yZWdyZXNzaW9uLXRlc3QueHNsIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJ0LWNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnRlc3QuUmVncmVzc2lvblRlc3QiLz4KLQotICAgIDwhLS0gRW5zdXJlIHRoYXQgdGhlIGZpbGUgZXhpc3RzLCBhbmQgZ2l2ZSBzZW5zaWJsZSBiZWhhdmlvdXIgaWYgbm90IC0tPgotICAgIDxzdHlsZSBzdHlsZT0iJHtydC1zdHlsZXNoZWV0fSIgaW49IiR7bmV3ZmlsZX0iIG91dD0iJHtuZXdmaWxlfS50bXAiLz4KLSAgICA8c3R5bGUgc3R5bGU9IiR7cnQtc3R5bGVzaGVldH0iIGluPSIke29sZGZpbGV9IiBvdXQ9IiR7b2xkZmlsZX0udG1wIi8+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSIke3J0LWNsYXNzbmFtZX0iPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QtcGx1Z2luLWRpcn0vYmluIi8+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxhcmcgdmFsdWU9IiR7b2xkZmlsZX0udG1wIi8+Ci0gICAgICA8YXJnIHZhbHVlPSIke25ld2ZpbGV9LnRtcCIvPgotICAgICAgPGFyZyB2YWx1ZT0iJHtvdXRmaWxlfSIvPgotICAgIDwvamF2YT4KLQotICAgIDxkZWxldGUgZmlsZT0iJHtvbGRmaWxlfS50bXAiLz4KLSAgICA8ZGVsZXRlIGZpbGU9IiR7bmV3ZmlsZX0udG1wIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ibm90Zml5Ij4KLTwhLS0KLVBhcmFtZXRlcnMgdG8gdGhpcyB0YXJnZXQ6Ci1pbmZpbGUJCQktIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UgYm9keQotYWRkcmVzcwkJCS0gdGhlIGUtbWFpbCBhZGRyZXNzIHRvIG5vdGlmeQotLS0+Ci0KLSAgICA8ZWNobyBtZXNzYWdlPSJTZW5kaW5nIE5vdGlmaWNhdGlvbiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJlbWFpbC1mcm9tIiB2YWx1ZT0iRWNsaXBzZSBBdXRvbWF0ZWQgVGVzdEBvdGkuY29tIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImVtYWlsLXN1YmplY3QiIHZhbHVlPSJOaWdodGx5IEJ1aWxkIFJlcG9ydCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJlbWFpbC1zZXJ2ZXIiIHZhbHVlPSJtYWlsLm90dC5vdGkuY29tIi8+Ci0KLSAgICA8bWFpbCBmcm9tPSIke2VtYWlsLWZyb219IiB0b2xpc3Q9IiR7YWRkcmVzc30iCi0gICAgICAgICAgc3ViamVjdD0iJHtlbWFpbC1zdWJqZWN0fSIgZmlsZXM9IiR7aW5maWxlfSIKLSAgICAgICAgICBtYWlsaG9zdD0iJHtlbWFpbC1zZXJ2ZXJ9Ii8+Ci0KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhYjQyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3QvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVjbGlwc2UgQXV0b21hdGVkIFRlc3RpbmcKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3QvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWZjN2YyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS50ZXN0IgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIyLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImF1dG9tYXRlZC5qYXIiLz4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuYXBhY2hlLmFudCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucGVyZm1zci5jb3JlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJjb3JldGVzdGFwcGxpY2F0aW9uIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPgotICAgICAgPGFwcGxpY2F0aW9uPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnRlc3QuQ29yZVRlc3RBcHBsaWNhdGlvbiI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ1aXRlc3RhcHBsaWNhdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS50ZXN0LlVJVGVzdEFwcGxpY2F0aW9uIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgIG5hbWU9InByb2R1Y3RJbmZvIgotICAgICAgICAgICAgICAgICAgdmFsdWU9InByb2R1Y3QuaW5pIj4KLSAgICAgICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS50ZXN0L3JlZ3Jlc3Npb24tdGVzdC54c2wgYi9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3QvcmVncmVzc2lvbi10ZXN0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwMzIxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3QvcmVncmVzc2lvbi10ZXN0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0IiBpbmRlbnQ9Im5vIi8+Ci0KLTwhLS0KLVRoaXMgc3R5bGVzaGVldCBpcyB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgY29sbGVjdGVkIGxpc3Qgb2YgdGVzdCByZXN1bHRzIGluIFhNTAotaW50byBhIHNvcnRlZCBsaXN0IG9mIG5hbWUvc3RhdHVzIHBhaXJzIGluIHBsYWludGV4dC4gVGhpcyBwbGFpbnRleHQgbGlzdCBpcwotdGhlbiBzdWl0YWJsZSBmb3IgZWFzeSByZWdyZXNzaW9uIHRlc3RpbmcuCi0tLT4KLQotPHhzbDp2YXJpYWJsZSBuYW1lPSJuZXdsaW5lIj4KLTx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci08L3hzbDp2YXJpYWJsZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci08eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlL3Rlc3RjYXNlIj4KLQk8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgotCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotCTx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLQk8eHNsOmNob29zZT4KLQkJPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPgotCQkJPHhzbDp0ZXh0PmZhaWw8L3hzbDp0ZXh0PgotCQk8L3hzbDp3aGVuPgotCQk8eHNsOndoZW4gdGVzdD0iZXJyb3IiPgotCQkJPHhzbDp0ZXh0PmVycm9yPC94c2w6dGV4dD4KLQkJPC94c2w6d2hlbj4KLQkJPHhzbDpvdGhlcndpc2U+Ci0JCQk8eHNsOnRleHQ+cGFzczwveHNsOnRleHQ+Ci0JCTwveHNsOm90aGVyd2lzZT4KLQk8L3hzbDpjaG9vc2U+Ci0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuZXdsaW5lIi8+Ci08L3hzbDpmb3ItZWFjaD4KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9zcmMvb3JnL2VjbGlwc2UvdGVzdC9Db3JlVGVzdEFwcGxpY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3Qvc3JjL29yZy9lY2xpcHNlL3Rlc3QvQ29yZVRlc3RBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTVhYjVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9zcmMvb3JnL2VjbGlwc2UvdGVzdC9Db3JlVGVzdEFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGxhdGZvcm1SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICogQSBhbiBhcHBsaWNhdGlvbiB0aGF0IGxhdW5jaGVzIHRlc3RzIG9uY2UgaXQgaXMgc3RhcnRlZC4KLSAqLwotcHVibGljIGNsYXNzIENvcmVUZXN0QXBwbGljYXRpb24gaW1wbGVtZW50cyBJUGxhdGZvcm1SdW5uYWJsZSB7Ci0JLyoqIHRydWUgaWYgd29ya3NwYWNlIHRlc3RzIHNob3VsZCBsb2cgdGhlaXIgZGVsdGFzICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWx0YXM9IGZhbHNlOwotCQotCS8qKgotCSAqIFJ1bnMgYSBzZXQgb2YgdGVzdHMgYXMgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gY29tbWFuZCBsaW5lIGFyZ3MuCi0JICogVGhpcyBpcyB0aGUgcGxhdGZvcm0gYXBwbGljYXRpb24gZW50cnkgcG9pbnQuCi0JICogQHNlZSBJUGxhdGZvcm1SdW5uYWJsZQotCSAqLwotCXB1YmxpYyBPYmplY3QgcnVuKE9iamVjdCBhcmd1bWVudHMpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdbXSBhcmdzPSBQbGF0Zm9ybS5nZXRDb21tYW5kTGluZUFyZ3MoKTsvL2dldENvbW1hbmQvL3Byb2Nlc3NDb21tYW5kTGluZSgoU3RyaW5nW10pIGFyZ3VtZW50cyk7Ci0JCXJldHVybiBuZXcgSW50ZWdlcihydW5UZXN0cyhhcmdzKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBydW5UZXN0cyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gRWNsaXBzZVRlc3RSdW5uZXIucnVuKGFyZ3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWx0YXNFbmFibGVkKCkgewotCQlyZXR1cm4gZGVsdGFzOwotCX0KLQkJCi0JcHJvdGVjdGVkIFN0cmluZ1tdIHByb2Nlc3NDb21tYW5kTGluZShTdHJpbmdbXSBhcmdzKSB7Ci0JCWludFtdIGNvbmZpZ0FyZ3MgPSBuZXcgaW50WzEwMF07Ci0JCWNvbmZpZ0FyZ3NbMF0gPSAtMTsgLy8gbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaXJzdCBlbGVtZW50IHRvIHNvbWV0aGluZyB0aGF0IGNvdWxkIG5vdCBiZSBhbiBpbmRleC4KLQkJaW50IGNvbmZpZ0FyZ0luZGV4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkvLyBjaGVjayBmb3IgYXJncyB3aXRob3V0IHBhcmFtZXRlcnMgKGkuZS4sIGEgZmxhZyBhcmcpCi0JCQkvLyBzZWUgaWYgd2Ugc2hvdWxkIGJlIGxvZ2dpbmcgZGVsdGFzCi0JCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItZGVsdGFzIikpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJZGVsdGFzID0gdHJ1ZTsKLQkJCX0KLQkJCWlmIChmb3VuZCkgewotCQkJCWNvbmZpZ0FyZ3NbY29uZmlnQXJnSW5kZXgrK10gPSBpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aCBwYXJhbWV0ZXJzCi0JCQlpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEgfHwgYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1srK2ldOwotCi0JCQkvLyBkb25lIGNoZWNraW5nIGZvciBhcmdzLiAgUmVtZW1iZXIgd2hlcmUgYW4gYXJnIHdhcyBmb3VuZCAKLQkJCWlmIChmb3VuZCkgewotCQkJCWNvbmZpZ0FyZ3NbY29uZmlnQXJnSW5kZXgrK10gPSBpIC0gMTsKLQkJCQljb25maWdBcmdzW2NvbmZpZ0FyZ0luZGV4KytdID0gaTsKLQkJCX0KLQkJfQotCQotCQkvL3JlbW92ZSBhbGwgdGhlIGFyZ3VtZW50cyBjb25zdW1lZCBieSB0aGlzIGFyZ3VtZW50IHBhcnNpbmcKLQkJaWYgKGNvbmZpZ0FyZ0luZGV4ID09IDApCi0JCQlyZXR1cm4gYXJnczsKLQkJU3RyaW5nW10gcGFzc1RocnVBcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIGNvbmZpZ0FyZ0luZGV4XTsKLQkJY29uZmlnQXJnSW5kZXggPSAwOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgPT0gY29uZmlnQXJnc1tjb25maWdBcmdJbmRleF0pCi0JCQkJY29uZmlnQXJnSW5kZXgrKzsKLQkJCWVsc2UKLQkJCQlwYXNzVGhydUFyZ3NbaisrXSA9IGFyZ3NbaV07Ci0JCX0KLQkJcmV0dXJuIHBhc3NUaHJ1QXJnczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3Qvc3JjL29yZy9lY2xpcHNlL3Rlc3QvRWNsaXBzZVRlc3RSdW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9zcmMvb3JnL2VjbGlwc2UvdGVzdC9FY2xpcHNlVGVzdFJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNjYTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9zcmMvb3JnL2VjbGlwc2UvdGVzdC9FY2xpcHNlVGVzdFJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudGVzdDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0TGlzdGVuZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkZvcm1hdHRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRSZXN1bHRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuSVBlcmZvcm1hbmNlTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuUGVyZk1zckNvcmVQbHVnaW47Ci0KLS8qKgotICogQSBUZXN0UnVubmVyIGZvciBKVW5pdCB0aGF0IHN1cHBvcnRzIEFudCBKVW5pdFJlc3VsdEZvcm1hdHRlcnMKLSAqIGFuZCBydW5uaW5nIHRlc3RzIGluc2lkZSBFY2xpcHNlLgotICogRXhhbXBsZSBjYWxsOiBFY2xpcHNlVGVzdFJ1bm5lciAtY2xhc3NuYW1lIGp1bml0LnNhbXBsZXMuU2ltcGxlVGVzdCBmb3JtYXR0ZXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuWE1MSlVuaXRSZXN1bHRGb3JtYXR0ZXIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VUZXN0UnVubmVyIGltcGxlbWVudHMgVGVzdExpc3RlbmVyIHsKLQljbGFzcyBUZXN0RmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkJVGVzdEZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQkJc3VwZXIobWVzc2FnZSk7Ci0JCX0KLQl9IAotCS8qKgotICAgICAqIE5vIHByb2JsZW1zIHdpdGggdGhpcyB0ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQ0NFU1M9IDA7Ci0gICAgLyoqCi0gICAgICogU29tZSB0ZXN0cyBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFJTFVSRVM9IDE7Ci0gICAgLyoqCi0gICAgICogQW4gZXJyb3Igb2NjdXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUlM9IDI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX01FVEhPRE5BTUU9ICJzdWl0ZSI7CQotCS8qKgotCSAqIGRlYnVnIG1vZGUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZGVidWc9IGZhbHNlOwotCS8qKgotCSAqIFRoZSBjdXJyZW50IHRlc3QgcmVzdWx0Ci0JICovCi0JcHJpdmF0ZSBUZXN0UmVzdWx0IGZUZXN0UmVzdWx0OwotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgdGVzdAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZUZXN0UGx1Z2luTmFtZTsKLQkvKioKLSAgICAgKiBUaGUgY29ycmVzcG9uZGluZyB0ZXN0c3VpdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUZXN0IGZTdWl0ZTsKLSAgICAvKioKLSAgICAgKiBGb3JtYXR0ZXJzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAgKi8KLQlwcml2YXRlIHN0YXRpYyBWZWN0b3IgZmdGcm9tQ21kTGluZT0gbmV3IFZlY3RvcigpOwotCS8qKgotICAgICAqIEhvbGRzIHRoZSByZWdpc3RlcmVkIGZvcm1hdHRlcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgZm9ybWF0dGVycz0gbmV3IFZlY3RvcigpOwotICAgIC8qKgotICAgICAqIERvIHdlIHN0b3Agb24gZXJyb3JzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmSGFsdE9uRXJyb3I9IGZhbHNlOwotICAgIC8qKgotICAgICAqIERvIHdlIHN0b3Agb24gdGVzdCBmYWlsdXJlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZkhhbHRPbkZhaWx1cmU9IGZhbHNlOwotICAgIC8qKgotICAgICAqIFRoZSBUZXN0U3VpdGUgd2UgYXJlIGN1cnJlbnRseSBydW5uaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgSlVuaXRUZXN0IGZKdW5pdFRlc3Q7Ci0gICAgLyoqIAotICAgICAqIG91dHB1dCB3cml0dGVuIGR1cmluZyB0aGUgdGVzdCAKLSAgICAgKi8KLSAgICBwcml2YXRlIFByaW50U3RyZWFtIGZTeXN0ZW1FcnJvcjsKLSAgICAvKiogCi0gICAgICogRXJyb3Igb3V0cHV0IGR1cmluZyB0aGUgdGVzdCAKLSAgICAgKi8KLSAgICBwcml2YXRlIFByaW50U3RyZWFtIGZTeXN0ZW1PdXQ7ICAgCi0gICAgLyoqCi0gICAgICogRXhjZXB0aW9uIGNhdWdodCBpbiBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIEV4Y2VwdGlvbiBmRXhjZXB0aW9uOwotICAgIC8qKgotICAgICAqIFJldHVybmNvZGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBmUmV0Q29kZT0gU1VDQ0VTUzsJCi0gICAgCi0JLyoqIAotCSAqIFRoZSBtYWluIGVudHJ5IHBvaW50ICh0aGUgcGFyYW1ldGVycyBhcmUgbm90IHlldCBjb25zaXN0ZW50IHdpdGgKLQkgKiB0aGUgQW50IEpVbml0VGVzdFJ1bm5lciwgYnV0IGV2ZW50dWFsbHkgdGhleSBzaG91bGQgYmUpLgotCSAqIFBhcmFtZXRlcnM8cHJlPgotCSAqIC1jbGFzc05hbWU6IHRoZSBuYW1lIG9mIHRoZSB0ZXN0U3VpdGUKLQkgKiAtdGVzdFBsdWdpbk5hbWU6IHRoZSBuYW1lIG9mIHRoZSBjb250YWluaW5nIHBsdWdpbgotICAgICAqIGhhbHRPbkVycm9yOiBoYWx0IHRlc3Qgb24gZXJyb3JzPwotICAgICAqIGhhbHRPbkZhaWx1cmU6IGhhbHQgdGVzdCBvbiBmYWlsdXJlcz8KLSAgICAgKiAtdGVzdGxpc3RlbmVyIGxpc3RlbmVyQ2xhc3M6IGRlcHJlY2F0ZWQKLSAgICAgKiAJCXByaW50IGEgd2FybmluZyB0aGF0IHRoaXMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQKLSAgICAgKiBmb3JtYXR0ZXI6IGEgSlVuaXRSZXN1bHRGb3JtYXR0ZXIgZ2l2ZW4gYXMgY2xhc3NuYW1lLGZpbGVuYW1lLiAKLSAgICAgKiAgCUlmIGZpbGVuYW1lIGlzIG9tbWl0dGVkLCBTeXN0ZW0ub3V0IGlzIGFzc3VtZWQuCi0gICAgICogPC9wcmU+Ci0gICAgICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3lzdGVtLmV4aXQocnVuKGFyZ3MpKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBpbnQgcnVuKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjbGFzc05hbWU9IG51bGw7Ci0JCVN0cmluZyB0ZXN0UGx1Z2luTmFtZT0gbnVsbDsKLQkJCi0gICAgICAgIGJvb2xlYW4gaGFsdEVycm9yID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gaGFsdEZhaWwgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQkKLQkJaW50IHN0YXJ0QXJncz0gMDsKLQkJaWYgKGFyZ3MubGVuZ3RoID4gMCkgewotCQkJLy8gc3VwcG9ydCB0aGUgSlVuaXQgdGFzayBjb21tYW5kbGluZSBzeW50YXggd2hlcmUKLQkJCS8vIHRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjbGFzcwotCQkJaWYgKCFhcmdzWzBdLnN0YXJ0c1dpdGgoIi0iKSkgewotCQkJCWNsYXNzTmFtZT0gYXJnc1swXTsKLQkJCQlzdGFydEFyZ3MrKzsKLQkJCX0KLQkJfSAKLQkJZm9yIChpbnQgaT0gc3RhcnRBcmdzOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFyZ3NbaV0udG9Mb3dlckNhc2UoKS5lcXVhbHMoIi1jbGFzc25hbWUiKSkgewotCQkJCWlmIChpIDwgYXJncy5sZW5ndGgtMSkKLQkJCQkJY2xhc3NOYW1lPSBhcmdzW2krMV07IAotCQkJCWkrKzsJCi0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0udG9Mb3dlckNhc2UoKS5lcXVhbHMoIi10ZXN0cGx1Z2lubmFtZSIpKSB7Ci0JCQkJaWYgKGkgPCBhcmdzLmxlbmd0aC0xKQotCQkJCQl0ZXN0UGx1Z2luTmFtZT0gYXJnc1tpKzFdOyAKLQkJCQlpKys7CQotCQkJfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoImhhbHRPbkVycm9yPSIpKSB7Ci0gICAgICAgICAgICAgICAgaGFsdEVycm9yPSBQcm9qZWN0LnRvQm9vbGVhbihhcmdzW2ldLnN1YnN0cmluZygxMikpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoImhhbHRPbkZhaWx1cmU9IikpIHsKLSAgICAgICAgICAgICAgICBoYWx0RmFpbCA9IFByb2plY3QudG9Cb29sZWFuKGFyZ3NbaV0uc3Vic3RyaW5nKDE0KSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiZm9ybWF0dGVyPSIpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlQW5kU3RvcmVGb3JtYXR0ZXIoYXJnc1tpXS5zdWJzdHJpbmcoMTApKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgicHJvcHNmaWxlPSIpKSB7Ci0gICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShhcmdzW2ldLnN1YnN0cmluZygxMCkpOwotICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOwotICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItdGVzdGxpc3RlbmVyIikpIHsKLSAgICAgICAgICAgIAlTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSAtdGVzdGxpc3RlbmVyIG9wdGlvbiBpcyBubyBsb25nZXIgc3VwcG9ydGVkXG51c2UgdGhlIGZvcm1hdHRlcj0gb3B0aW9uIGluc3RlYWQiKTsKLSAgICAgICAgICAgIAlyZXR1cm4gRVJST1JTOwotCQkJfQotICAgICAgICB9Ci0JCQkKLQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGVzdCBjbGFzcyBuYW1lIG5vdCBzcGVjaWZpZWQiKTsKLQkJCi0gICAgICAgIEpVbml0VGVzdCB0PSBuZXcgSlVuaXRUZXN0KGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgLy8gQWRkL292ZXJsYXkgc3lzdGVtIHByb3BlcnRpZXMgb24gdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgQW50IHByb2plY3QKLSAgICAgICAgSGFzaHRhYmxlIHA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZW51bSA9IHAua2V5cygpOyBlbnVtLmhhc01vcmVFbGVtZW50cygpOyApIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBlbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBwcm9wcy5wdXQoa2V5LCBwLmdldChrZXkpKTsKLSAgICAgICAgfQotICAgICAgICB0LnNldFByb3BlcnRpZXMocHJvcHMpOwotCQotCSAgICBFY2xpcHNlVGVzdFJ1bm5lciBydW5uZXI9IG5ldyBFY2xpcHNlVGVzdFJ1bm5lcih0LCB0ZXN0UGx1Z2luTmFtZSwgaGFsdEVycm9yLCBoYWx0RmFpbCk7Ci0gICAgICAgIHRyYW5zZmVyRm9ybWF0dGVycyhydW5uZXIpOwotICAgICAgICBydW5uZXIucnVuKCk7Ci0gICAgICAgIHJldHVybiBydW5uZXIuZ2V0UmV0Q29kZSgpOwotCX0KLQotICAgIC8qKgotICAgICAqICAgCi0gICAgICovCi0gICAgcHVibGljIEVjbGlwc2VUZXN0UnVubmVyKEpVbml0VGVzdCB0ZXN0LCBTdHJpbmcgdGVzdFBsdWdpbk5hbWUsIGJvb2xlYW4gaGFsdE9uRXJyb3IsIGJvb2xlYW4gaGFsdE9uRmFpbHVyZSkgewotICAgICAgICBmSnVuaXRUZXN0PSB0ZXN0OwotICAgICAgICBmVGVzdFBsdWdpbk5hbWU9IHRlc3RQbHVnaW5OYW1lOwotICAgICAgICBmSGFsdE9uRXJyb3I9IGhhbHRPbkVycm9yOwotICAgICAgICBmSGFsdE9uRmFpbHVyZT0gaGFsdE9uRmFpbHVyZTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmU3VpdGU9IGdldFRlc3QodGVzdC5nZXROYW1lKCkpOwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmUmV0Q29kZSA9IEVSUk9SUzsKLSAgICAgICAgICAgIGZFeGNlcHRpb24gPSBlOwotICAgICAgICB9Ci0gICAgfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIFRlc3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gc3VpdGUuIAotCSAqLwotCXByb3RlY3RlZCBUZXN0IGdldFRlc3QoU3RyaW5nIHN1aXRlQ2xhc3NOYW1lKSB0aHJvd3MgVGVzdEZhaWxlZEV4Y2VwdGlvbiB7Ci0JCWlmIChzdWl0ZUNsYXNzTmFtZS5sZW5ndGgoKSA8PSAwKSB7Ci0JCQljbGVhclN0YXR1cygpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ2xhc3MgdGVzdENsYXNzPSBudWxsOwotCQl0cnkgewotCQkJdGVzdENsYXNzPSBsb2FkU3VpdGVDbGFzcyhzdWl0ZUNsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIGNsYXp6PSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChjbGF6eiA9PSBudWxsKSAKLQkJCQljbGF6ej0gc3VpdGVDbGFzc05hbWU7Ci0JCQlydW5GYWlsZWQoIkNsYXNzIG5vdCBmb3VuZCBcIiIrY2xhenorIlwiIik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJcnVuRmFpbGVkKCJFcnJvcjogIitlLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTWV0aG9kIHN1aXRlTWV0aG9kPSBudWxsOwotCQl0cnkgewotCQkJc3VpdGVNZXRob2Q9IHRlc3RDbGFzcy5nZXRNZXRob2QoU1VJVEVfTUVUSE9ETkFNRSwgbmV3IENsYXNzWzBdKTsKLQkgCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkgCQkvLyB0cnkgdG8gZXh0cmFjdCBhIHRlc3Qgc3VpdGUgYXV0b21hdGljYWxseQotCQkJY2xlYXJTdGF0dXMoKTsJCQkKLQkJCXJldHVybiBuZXcgVGVzdFN1aXRlKHRlc3RDbGFzcyk7Ci0JCX0KLQkJVGVzdCB0ZXN0PSBudWxsOwotCQl0cnkgewotCQkJdGVzdD0gKFRlc3Qpc3VpdGVNZXRob2QuaW52b2tlKG51bGwsIG5ldyBDbGFzc1swXSk7IC8vIHN0YXRpYyBtZXRob2QKLQkJCWlmICh0ZXN0ID09IG51bGwpCi0JCQkJcmV0dXJuIHRlc3Q7Ci0JCX0gCi0JCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCXJ1bkZhaWxlZCgiRmFpbGVkIHRvIGludm9rZSBzdWl0ZSgpOiIgKyBlLmdldFRhcmdldEV4Y2VwdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJcnVuRmFpbGVkKCJGYWlsZWQgdG8gaW52b2tlIHN1aXRlKCk6IiArIGUudG9TdHJpbmcoKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQljbGVhclN0YXR1cygpOwotCQlyZXR1cm4gdGVzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBydW5GYWlsZWQoU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBUZXN0RmFpbGVkRXhjZXB0aW9uIHsKLQkJU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOwotCQl0aHJvdyBuZXcgVGVzdEZhaWxlZEV4Y2VwdGlvbihtZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclN0YXR1cygpIHsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgY2xhc3MgZWl0aGVyIHdpdGggdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIgb3IgYQotCSAqIHBsdWdpbiBjbHNhcyBsb2FkZXIgaWYgYSBwbHVnaW4gbmFtZSB3YXMgc3BlY2lmaWVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGxvYWRTdWl0ZUNsYXNzKFN0cmluZyBzdWl0ZUNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoZlRlc3RQbHVnaW5OYW1lID09IG51bGwpCi0JCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShzdWl0ZUNsYXNzTmFtZSk7Ci0JCUNsYXNzTG9hZGVyIGxvYWRlcj0gZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoZlRlc3RQbHVnaW5OYW1lKTsKLQkJcmV0dXJuIGxvYWRlci5sb2FkQ2xhc3Moc3VpdGVDbGFzc05hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBQbHVnaW4gY2xhc3MgbG9hZGVyIG9mIHRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgdGVzdC4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoU3RyaW5nIHBsdWdpbk5hbWUpIHsKLQkJaWYgKFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcihwbHVnaW5OYW1lKSAhPSBudWxsKQotCQkJcmV0dXJuIFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcihwbHVnaW5OYW1lKS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpOwkKLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gQ2xhc3NMb2FkZXIgZm91bmQgZm9yIHRlc3RwbHVnaW46ICIgKyBwbHVnaW5OYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJUGVyZm9ybWFuY2VNb25pdG9yIHBtID0gUGVyZk1zckNvcmVQbHVnaW4uZ2V0UGVyZm9ybWFuY2VNb25pdG9yKHRydWUpOwotCQkKLSAgICAgICAgZlRlc3RSZXN1bHQ9IG5ldyBUZXN0UmVzdWx0KCk7Ci0gICAgICAgIGZUZXN0UmVzdWx0LmFkZExpc3RlbmVyKHRoaXMpOwotICAgICAgICBmb3IgKGludCBpPSAwOyBpIDwgZm9ybWF0dGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZlRlc3RSZXN1bHQuYWRkTGlzdGVuZXIoKFRlc3RMaXN0ZW5lcilmb3JtYXR0ZXJzLmVsZW1lbnRBdChpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHN0YXJ0PSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmlyZVN0YXJ0VGVzdFN1aXRlKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZkV4Y2VwdGlvbiAhPSBudWxsKSB7IC8vIGhhZCBhbiBleGNlcHRpb24gaW4gdGhlIGNvbnN0cnVjdG9yCi0gICAgICAgICAgICBmb3IgKGludCBpPSAwOyBpIDwgZm9ybWF0dGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICgoVGVzdExpc3RlbmVyKWZvcm1hdHRlcnMuZWxlbWVudEF0KGkpKS5hZGRFcnJvcihudWxsLCBmRXhjZXB0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZKdW5pdFRlc3Quc2V0Q291bnRzKDEsIDAsIDEpOwotICAgICAgICAgICAgZkp1bml0VGVzdC5zZXRSdW5UaW1lKDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGVyclN0cm0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBmU3lzdGVtRXJyb3I9IG5ldyBQcmludFN0cmVhbShlcnJTdHJtKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cm0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBmU3lzdGVtT3V0PSBuZXcgUHJpbnRTdHJlYW0ob3V0U3RybSk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAJcG0uc25hcHNob3QoMSk7IC8vIGJlZm9yZQotICAgICAgICAgICAgICAgIGZTdWl0ZS5ydW4oZlRlc3RSZXN1bHQpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIAlwbS5zbmFwc2hvdCgyKTsgLy8gYWZ0ZXIgIAkKLSAgICAgICAgICAgICAgICBmU3lzdGVtRXJyb3IuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBmU3lzdGVtRXJyb3I9IG51bGw7Ci0gICAgICAgICAgICAgICAgZlN5c3RlbU91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIGZTeXN0ZW1PdXQ9IG51bGw7Ci0gICAgICAgICAgICAgICAgc2VuZE91dEFuZEVycihuZXcgU3RyaW5nKG91dFN0cm0udG9CeXRlQXJyYXkoKSksIG5ldyBTdHJpbmcoZXJyU3RybS50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgICAgICAgICAgZkp1bml0VGVzdC5zZXRDb3VudHMoZlRlc3RSZXN1bHQucnVuQ291bnQoKSwgZlRlc3RSZXN1bHQuZmFpbHVyZUNvdW50KCksIGZUZXN0UmVzdWx0LmVycm9yQ291bnQoKSk7Ci0gICAgICAgICAgICAgICAgZkp1bml0VGVzdC5zZXRSdW5UaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpcmVFbmRUZXN0U3VpdGUoKTsKLQotICAgICAgICBpZiAoZlJldENvZGUgIT0gU1VDQ0VTUyB8fCBmVGVzdFJlc3VsdC5lcnJvckNvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgZlJldENvZGUgPSBFUlJPUlM7Ci0gICAgICAgIH0gZWxzZSBpZiAoZlRlc3RSZXN1bHQuZmFpbHVyZUNvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgZlJldENvZGUgPSBGQUlMVVJFUzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcG0udXBsb2FkKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0JCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGF0IFN5c3RlbS5leGl0KCkgd291bGQgcmV0dXJuIGluIHRoZSBzdGFuZGFsb25lIHZlcnNpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDIgaWYgZXJyb3JzIG9jY3VycmVkLCAxIGlmIHRlc3RzIGZhaWxlZCBlbHNlIDAuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRSZXRDb2RlKCkgewotICAgICAgICByZXR1cm4gZlJldENvZGU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIFRlc3RMaXN0ZW5lci5hZGRGYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdCkge30KLQotICAgIC8qCi0gICAgICogQHNlZSBUZXN0TGlzdGVuZXIuYWRkRmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7fQotCi0gICAgLyoKLSAgICAgKiBAc2VlIFRlc3RMaXN0ZW5lci5hZGRGYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIEFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsKLSAgICAgICAgaWYgKGZIYWx0T25GYWlsdXJlKSB7Ci0gICAgICAgICAgICBmVGVzdFJlc3VsdC5zdG9wKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgVGVzdExpc3RlbmVyLmFkZEVycm9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRXJyb3IoVGVzdCB0ZXN0LCBUaHJvd2FibGUgdCkgewotICAgICAgICBpZiAoZkhhbHRPbkVycm9yKSB7Ci0gICAgICAgICAgICBmVGVzdFJlc3VsdC5zdG9wKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIGZpcmVTdGFydFRlc3RTdWl0ZSgpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGZvcm1hdHRlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICgoSlVuaXRSZXN1bHRGb3JtYXR0ZXIpZm9ybWF0dGVycy5lbGVtZW50QXQoaSkpLnN0YXJ0VGVzdFN1aXRlKGZKdW5pdFRlc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVFbmRUZXN0U3VpdGUoKSB7Ci0gICAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBmb3JtYXR0ZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAoKEpVbml0UmVzdWx0Rm9ybWF0dGVyKWZvcm1hdHRlcnMuZWxlbWVudEF0KGkpKS5lbmRUZXN0U3VpdGUoZkp1bml0VGVzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGb3JtYXR0ZXIoSlVuaXRSZXN1bHRGb3JtYXR0ZXIgZikgewotICAgICAgICBmb3JtYXR0ZXJzLmFkZEVsZW1lbnQoZik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGluZSBmb3JtYXQgaXM6IGZvcm1hdHRlcj08Y2xhc3NuYW1lPigsPHBhdGhuYW1lPik/Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVBbmRTdG9yZUZvcm1hdHRlcihTdHJpbmcgbGluZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgRm9ybWF0dGVyRWxlbWVudCBmZSA9IG5ldyBGb3JtYXR0ZXJFbGVtZW50KCk7Ci0gICAgICAgIFN0cmluZyBmb3JtYXR0ZXJDbGFzc05hbWU9IG51bGw7Ci0gICAgICAgIEZpbGUgZm9ybWF0dGVyRmlsZT0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGludCBwb3MgPSBsaW5lLmluZGV4T2YoJywnKTsKLSAgICAgICAgaWYgKHBvcyA9PSAtMSkgewotICAgICAgICAgICAgZm9ybWF0dGVyQ2xhc3NOYW1lPSBsaW5lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9ybWF0dGVyQ2xhc3NOYW1lPSBsaW5lLnN1YnN0cmluZygwLCBwb3MpOwotICAgICAgICAgICAgZm9ybWF0dGVyRmlsZT0gbmV3IEZpbGUobGluZS5zdWJzdHJpbmcocG9zICsgMSkpOyAvLyB0aGUgbWV0aG9kIGlzIHBhY2thZ2UgdmlzaWJsZQotICAgICAgICB9Ci0gICAgICAgIGZnRnJvbUNtZExpbmUuYWRkRWxlbWVudChjcmVhdGVGb3JtYXR0ZXIoZm9ybWF0dGVyQ2xhc3NOYW1lLCBmb3JtYXR0ZXJGaWxlKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cmFuc2ZlckZvcm1hdHRlcnMoRWNsaXBzZVRlc3RSdW5uZXIgcnVubmVyKSB7Ci0gICAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBmZ0Zyb21DbWRMaW5lLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBydW5uZXIuYWRkRm9ybWF0dGVyKChKVW5pdFJlc3VsdEZvcm1hdHRlcilmZ0Zyb21DbWRMaW5lLmVsZW1lbnRBdChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQkvKgotCSAqIERVUExJQ0FURUQgZnJvbSBGb3JtYXR0ZXJFbGVtZW50LCBzaW5jZSBpdCBpcyBwYWNrYWdlIHZpc2libGUgb25seQotCSAqLwotICAgIHByaXZhdGUgc3RhdGljIEpVbml0UmVzdWx0Rm9ybWF0dGVyIGNyZWF0ZUZvcm1hdHRlcihTdHJpbmcgY2xhc3NuYW1lLCBGaWxlIG91dGZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgCU91dHB1dFN0cmVhbSBvdXQ9IFN5c3RlbS5vdXQ7Ci0KLSAgICAgICAgaWYgKGNsYXNzbmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInlvdSBtdXN0IHNwZWNpZnkgdHlwZSBvciBjbGFzc25hbWUiKTsKLSAgICAgICAgfQotICAgICAgICBDbGFzcyBmID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGY9IEVjbGlwc2VUZXN0UnVubmVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzbmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG8gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbyA9IGYubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEpVbml0UmVzdWx0Rm9ybWF0dGVyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNsYXNzbmFtZSsiIGlzIG5vdCBhIEpVbml0UmVzdWx0Rm9ybWF0dGVyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBKVW5pdFJlc3VsdEZvcm1hdHRlciByID0gKEpVbml0UmVzdWx0Rm9ybWF0dGVyKSBvOwotCi0gICAgICAgIGlmIChvdXRmaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0ZmlsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgci5zZXRPdXRwdXQob3V0KTsKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRPdXRBbmRFcnIoU3RyaW5nIG91dCwgU3RyaW5nIGVycikgewotICAgICAgICBmb3IgKGludCBpPTA7IGk8Zm9ybWF0dGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSlVuaXRSZXN1bHRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gCi0gICAgICAgICAgICAgICAgKChKVW5pdFJlc3VsdEZvcm1hdHRlcilmb3JtYXR0ZXJzLmVsZW1lbnRBdChpKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvcm1hdHRlci5zZXRTeXN0ZW1PdXRwdXQob3V0KTsKLSAgICAgICAgICAgIGZvcm1hdHRlci5zZXRTeXN0ZW1FcnJvcihlcnIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU91dHB1dChTdHJpbmcgbGluZSkgewotICAgICAgICBpZiAoZlN5c3RlbU91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmU3lzdGVtT3V0LnByaW50bG4obGluZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXJyb3JPdXRwdXQoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgaWYgKGZTeXN0ZW1FcnJvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmU3lzdGVtRXJyb3IucHJpbnRsbihsaW5lKTsKLSAgICAgICAgfQotICAgIH0KLX0JCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3Qvc3JjL29yZy9lY2xpcHNlL3Rlc3QvUmVncmVzc2lvblRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9zcmMvb3JnL2VjbGlwc2UvdGVzdC9SZWdyZXNzaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjNlZTQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9zcmMvb3JnL2VjbGlwc2UvdGVzdC9SZWdyZXNzaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudGVzdDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLQotLyoqCi0gKiBDaGVjayB0aGUgb3V0cHV0IG9mIHNldmVyYWwgdGVzdHMgZm9yIHJlZ3Jlc3Npb25zLgotICovCi1wdWJsaWMgY2xhc3MgUmVncmVzc2lvblRlc3QgewotCi0JUHJpbnRTdHJlYW0gb3V0cHV0OwotCVN0cmluZyBvbGRGaWxlbmFtZSwgbmV3RmlsZW5hbWUsIG91dEZpbGVuYW1lOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEhJTkdfQ0hBTkdFRF9NU0cKLQkJPSAiQWxsIHRlc3RzIHVuY2hhbmdlZC4iOwkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVncmVzc2lvblRlc3QKLQkgKi8KLQlwdWJsaWMgUmVncmVzc2lvblRlc3QoCVN0cmluZyBvbGRGaWxlbmFtZSwKLQkJCQkJCQlTdHJpbmcgbmV3RmlsZW5hbWUsCi0JCQkJCQkJU3RyaW5nIG91dEZpbGVuYW1lKSB7Ci0JCXRoaXMub2xkRmlsZW5hbWUgPSBvbGRGaWxlbmFtZTsKLQkJdGhpcy5uZXdGaWxlbmFtZSA9IG5ld0ZpbGVuYW1lOwotCQl0aGlzLm91dEZpbGVuYW1lID0gb3V0RmlsZW5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQlpZiAoYXJndi5sZW5ndGggPCAzKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiB0b28gZmV3IGFyZ3VtZW50cyIpOwotCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogKHByb2duYW1lKSBvbGRmaWxlIG5ld2ZpbGUgb3V0ZmlsZSIpOwotCQl9IGVsc2UgewotCQkJLy8gQVNTRVJUOiBUaGUgcHJvZ3JhbSBoYXMgYXQgbGVhc3QgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cwotCQkJUmVncmVzc2lvblRlc3QgcnQgPSBuZXcgUmVncmVzc2lvblRlc3QoYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSk7Ci0JCQlydC50ZXN0UmVncmVzc2lvbnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRlc3QgZm9yIHJlZ3Jlc3Npb25zIGluIHRoZSB0ZXN0IHN1aXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZWdyZXNzaW9ucygpIHsKLQkJLy8gUmVhZCB0aGUgb2xkIGFuZCBuZXcgZmlsZXMKLQkJU3RyaW5nIG9sZFBhc3MgPSAiIjsKLQkJU3RyaW5nIG5ld1Bhc3MgPSAiIjsKLQkJdHJ5IHsKLQkJCW9sZFBhc3MgPSByZWFkRmlsZShvbGRGaWxlbmFtZSk7Ci0JCQluZXdQYXNzID0gcmVhZEZpbGUobmV3RmlsZW5hbWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciBvcGVuaW5nIGlucHV0IGZpbGUiKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQlTeXN0ZW0uZXhpdCgtMSk7Ci0JCX0KLQotCQl0cnkgewotCQkJb3V0cHV0ID0gbmV3IFByaW50U3RyZWFtKAotCQkJCQkJbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAotCQkJCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKAotCQkJCQkJCQluZXcgRmlsZShvdXRGaWxlbmFtZSkpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUiKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQlTeXN0ZW0uZXhpdCgtMSk7Ci0JCX0KLQkJLy8gRXN0YWJsaXNoIHRoZWlyIHJlbGF0aW9uc2hpcAotCQlTdHJpbmdUb2tlbml6ZXIgb2xkc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG9sZFBhc3MpOwotCQlTdHJpbmdUb2tlbml6ZXIgbmV3c3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5ld1Bhc3MpOwotCi0JCVN0cmluZ1tdIG9sZFRlc3QgPSBuZXh0VGVzdChvbGRzdCk7Ci0JCVN0cmluZ1tdIG5ld1Rlc3QgPSBuZXh0VGVzdChuZXdzdCk7Ci0KLQkJYm9vbGVhbiBub3RoaW5nQ2hhbmdlZCA9IHRydWU7Ci0JCXdoaWxlIChvbGRUZXN0ICE9IG51bGwgJiYgbmV3VGVzdCAhPSBudWxsKSB7Ci0KLQkJCS8vIENvbXBhcmUgdGhlIHR3byB0ZXN0IG5hbWVzCi0JCQlpbnQgY29tcGFyZU5hbWUgPSBvbGRUZXN0WzBdLmNvbXBhcmVUbyhuZXdUZXN0WzBdKTsKLQkJCWlmIChjb21wYXJlTmFtZSA9PSAwKSB7Ci0JCQkJaW50IGNvbXBhcmVTdGF0dXMgPSBvbGRUZXN0WzFdLmNvbXBhcmVUbyhuZXdUZXN0WzFdKTsKLQkJCQlpZiAoY29tcGFyZVN0YXR1cyAhPSAwKSB7Ci0JCQkJCW5vdGhpbmdDaGFuZ2VkID0gZmFsc2U7Ci0JCQkJCW91dHB1dC5wcmludGxuKHRlc3RDaGFuZ2VkKG5ld1Rlc3QpKTsKLQkJCQl9Ci0JCQkJb2xkVGVzdCA9IG5leHRUZXN0KG9sZHN0KTsKLQkJCQluZXdUZXN0ID0gbmV4dFRlc3QobmV3c3QpOwotCQkJfSBlbHNlIGlmIChjb21wYXJlTmFtZSA8IDApIHsKLQkJCQkvLyBvbGRUZXN0TmFtZSBjb21lcyBmaXJzdAotCQkJCW91dHB1dC5wcmludGxuKHRlc3ROb3RSdW4ob2xkVGVzdCkpOwotCQkJCW9sZFRlc3QgPSBuZXh0VGVzdChvbGRzdCk7Ci0JCQkJbm90aGluZ0NoYW5nZWQgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbmV3VGVzdE5hbWUgY29tZXMgZmlyc3QKLQkJCQlvdXRwdXQucHJpbnRsbih0ZXN0QWRkZWQobmV3VGVzdCkpOwotCQkJCW5ld1Rlc3QgPSBuZXh0VGVzdChuZXdzdCk7Ci0JCQkJbm90aGluZ0NoYW5nZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQkvLyBNYWtlIHN1cmUgYWxsIHRlc3RzIGFyZSBwYXJzZWQKLQkJd2hpbGUgKG9sZFRlc3QgIT0gbnVsbCkgewotCQkJLy8gb2xkVGVzdE5hbWUgY29tZXMgZmlyc3QKLQkJCW91dHB1dC5wcmludGxuKHRlc3ROb3RSdW4ob2xkVGVzdCkpOwotCQkJb2xkVGVzdCA9IG5leHRUZXN0KG9sZHN0KTsKLQkJCW5vdGhpbmdDaGFuZ2VkID0gZmFsc2U7Ci0JCX0KLQkJd2hpbGUgKG5ld1Rlc3QgIT0gbnVsbCkgewotCQkJLy8gbmV3VGVzdE5hbWUgY29tZXMgZmlyc3QKLQkJCW91dHB1dC5wcmludGxuKHRlc3RBZGRlZChuZXdUZXN0KSk7Ci0JCQluZXdUZXN0ID0gbmV4dFRlc3QobmV3c3QpOwotCQkJbm90aGluZ0NoYW5nZWQgPSBmYWxzZTsKLQkJfQotCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBhbHdheXMgc29tZSBvdXRwdXQuCi0JCWlmIChub3RoaW5nQ2hhbmdlZCkgewotCQkJb3V0cHV0LnByaW50bG4oTk9USElOR19DSEFOR0VEX01TRyk7Ci0JCX0KLQkJb3V0cHV0LmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBtZXNzYWdlIGZvciB3aGVuIGEgdGVzdCBpcyBub3QgcnVuLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgdGVzdE5vdFJ1bihTdHJpbmdbXSB0ZXN0KSB7Ci0JCXJldHVybiAiTm90IHJ1bjogIiArIHRlc3RbMF07Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbWVzc2FnZSBmb3Igd2hlbiBhIHRlc3QncyBzdGF0dXMgY2hhbmdlcy4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIHRlc3RDaGFuZ2VkKFN0cmluZ1tdIHRlc3QpIHsKLQkJcmV0dXJuICJDaGFuZ2VkOiAiICsgdGVzdFswXSArICIsICIgKyB0ZXN0WzFdOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1lc3NhZ2UgZm9yIHdoZW4gYSB0ZXN0IGlzIGFkZGVkLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgdGVzdEFkZGVkKFN0cmluZ1tdIHRlc3QpIHsKLQkJcmV0dXJuICJOZXcgdGVzdDogIiArIHRlc3RbMF0gKyAiLCBTdGF0dXM6ICIgKyB0ZXN0WzFdOwotCX0KLQotCS8qKgotCSAqIFJlYWQgdGhlIGZpbGUgZ2l2ZW4gYnkgcywgYW5kIHJldHVybiBpdHMgY29udGVudHMuCi0JICovCi0Jc3RhdGljIFN0cmluZyByZWFkRmlsZShTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzgxOTJdOwotCQlGaWxlSW5wdXRTdHJlYW0gciA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocyk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBhU3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlpbnQgbjsKLQkJd2hpbGUgKChuID0gci5yZWFkKGJ1ZikpICE9IC0xKSB7Ci0JCQlhU3RyZWFtLndyaXRlKGJ1ZiwgMCwgbik7Ci0JCX0KLQkJci5jbG9zZSgpOwotCQlyZXR1cm4gYVN0cmVhbS50b1N0cmluZygpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IDIgdG9rZW5zIGluIHN0LCBpZiB0aGV5IGV4aXN0LgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGV5IGRvIG5vdC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nW10gbmV4dFRlc3QoU3RyaW5nVG9rZW5pemVyIHN0KSB7Ci0JCVN0cmluZ1tdIHRlc3QgPSBuZXcgU3RyaW5nWzJdOwotCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQl0ZXN0WzBdID0gc3QubmV4dFRva2VuKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQl0ZXN0WzFdID0gc3QubmV4dFRva2VuKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGVzdDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC9zcmMvb3JnL2VjbGlwc2UvdGVzdC9VSVRlc3RBcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS90ZXN0L1VJVGVzdEFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxN2M1MzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS90ZXN0L1VJVGVzdEFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS50ZXN0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsYXRmb3JtUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdGluZy5JVGVzdEhhcm5lc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGVzdGluZy5UZXN0YWJsZU9iamVjdDsKLQotLyoqCi0gKiBBIFdvcmtiZW5jaCB0aGF0IHJ1bnMgYSB0ZXN0IHN1aXRlIHNwZWNpZmllZCBpbiB0aGUKLSAqIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0gKi8gCi1wdWJsaWMgY2xhc3MgVUlUZXN0QXBwbGljYXRpb24gIGltcGxlbWVudHMgSVBsYXRmb3JtUnVubmFibGUsIElUZXN0SGFybmVzcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BUFBfM18wID0gIm9yZy5lY2xpcHNlLnVpLmlkZS53b3JrYmVuY2giOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQVBQX1BSRV8zXzAgPSAib3JnLmVjbGlwc2UudWkud29ya2JlbmNoIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgYm9vbGVhbiBmSW5EZXByZWNhdGVkTW9kZSA9IGZhbHNlOwotCXByaXZhdGUgVGVzdGFibGVPYmplY3QgZlRlc3RhYmxlT2JqZWN0OwotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuYm9vdC5JUGxhdGZvcm1SdW5uYWJsZQotCSAqLwotCXB1YmxpYyBPYmplY3QgcnVuKGZpbmFsIE9iamVjdCBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gR2V0IHRoZSBhcHBsaWNhdGlvbiB0byB0ZXN0Ci0JCUlQbGF0Zm9ybVJ1bm5hYmxlIGFwcGxpY2F0aW9uID0gZ2V0QXBwbGljYXRpb24oKFN0cmluZ1tdKWFyZ3MpOwotCQkKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoYXBwbGljYXRpb24pOwotCQkKLQkJaWYgKGZJbkRlcHJlY2F0ZWRNb2RlKQotCQkJcmV0dXJuIHJ1bkRlcHJlY2F0ZWRBcHBsaWNhdGlvbihhcHBsaWNhdGlvbiwgYXJncyk7Ci0JCQotCQlyZXR1cm4gcnVuQXBwbGljYXRpb24oYXBwbGljYXRpb24sIGFyZ3MpOwotCX0KLQkKLQkKLQkvKgotCSAqIHJldHVybiB0aGUgYXBwbGljYXRpb24gdG8gcnVuLCBvciBudWxsIGlmIG5vdCBldmVuIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uCi0JICogaXMgZm91bmQuCi0JICovCi0JcHJpdmF0ZSBJUGxhdGZvcm1SdW5uYWJsZSBnZXRBcHBsaWNhdGlvbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEFzc3VtZSB3ZSBhcmUgaW4gMy4wIG1vZGUuCi0JCS8vIEZpbmQgdGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGFzIHNwZWNpZmllZCBieSB0aGUgUERFIEpVbml0IGxhdW5jaGVyLgotCQkvLyBJZiBubyBhcHBsaWNhdGlvbiBpcyBzcGVjaWZpZWQsIHRoZSAzLjAgZGVmYXVsdCB3b3JrYmVuY2ggYXBwbGljYXRpb24KLQkJLy8gaXMgcmV0dXJuZWQuCi0JCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0KLQkJUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRFeHRlbnNpb24oCi0JCQkJUGxhdGZvcm0uUElfUlVOVElNRSwKLQkJCQlQbGF0Zm9ybS5QVF9BUFBMSUNBVElPTlMsCi0JCQkJZ2V0QXBwbGljYXRpb25Ub1J1bihhcmdzKSk7Ci0JCQotCQkvLyBJZiBubyAzLjAgZXh0ZW5zaW9uIGNhbiBiZSBmb3VuZCwgc2VhcmNoIHRoZSByZWdpc3RyeQotCQkvLyBmb3IgdGhlIHByZS0zLjAgZGVmYXVsdCB3b3JrYmVuY2ggYXBwbGljYXRpb24sIGkuZS4gb3JnLmVjbGlwc2UgdWkud29ya2JlbmNoCi0JCS8vIFNldCB0aGUgZGVwcmVjYXRlZCBmbGFnIHRvIHRydWUKLQkJaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7Ci0JCQlleHRlbnNpb24gPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldEV4dGVuc2lvbigKLQkJCQkJUGxhdGZvcm0uUElfUlVOVElNRSwKLQkJCQkJUGxhdGZvcm0uUFRfQVBQTElDQVRJT05TLAotCQkJCQlERUZBVUxUX0FQUF9QUkVfM18wKTsKLQkJCWZJbkRlcHJlY2F0ZWRNb2RlID0gdHJ1ZTsKLQkJfQotCQkKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZXh0ZW5zaW9uKTsKLQkJCi0JCS8vIElmIHRoZSBleHRlbnNpb24gZG9lcyBub3QgaGF2ZSB0aGUgY29ycmVjdCBncmFtbWFyLCByZXR1cm4gbnVsbC4KLQkJLy8gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGFwcGxpY2F0aW9uIG9iamVjdC4KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBydW5zID0gZWxlbWVudHNbMF0uZ2V0Q2hpbGRyZW4oInJ1biIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocnVucy5sZW5ndGggPiAwKSB7Ci0JCQkJT2JqZWN0IHJ1bm5hYmxlID0gcnVuc1swXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHJ1bm5hYmxlIGluc3RhbmNlb2YgSVBsYXRmb3JtUnVubmFibGUpCi0JCQkJCXJldHVybiAoSVBsYXRmb3JtUnVubmFibGUpIHJ1bm5hYmxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgLXRlc3RBcHBsaWNhdGlvbiBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHJ1bi4KLQkgKiBJZiB0aGUgUERFIEpVbml0IGxhdW5jaGVyIGRpZCBub3Qgc2V0IHRoaXMgYXJndW1lbnQsIHRoZW4gcmV0dXJuCi0JICogdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24uCi0JICogSW4gMy4wLCB0aGUgZGVmYXVsdCBpcyB0aGUgIm9yZy5lY2xpcHNlLnVpLmlkZS53b3JiZW5jaCIgYXBwbGljYXRpb24uCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwbGljYXRpb25Ub1J1bihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKCItdGVzdEFwcGxpY2F0aW9uIikgJiYgaSA8IGFyZ3MubGVuZ3RoIC0xKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGFyZ3NbaSsxXTsKLQkJfQotCQlyZXR1cm4gREVGQVVMVF9BUFBfM18wOwotCX0KLQkKLQkvKioKLQkgKiBJbiAzLjAgbW9kZQotCSAqIAotCSAqLwotCXByaXZhdGUgT2JqZWN0IHJ1bkFwcGxpY2F0aW9uKElQbGF0Zm9ybVJ1bm5hYmxlIGFwcGxpY2F0aW9uLCBPYmplY3QgYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZUZXN0YWJsZU9iamVjdCA9IFBsYXRmb3JtVUkuZ2V0VGVzdGFibGVPYmplY3QoKTsKLQkJZlRlc3RhYmxlT2JqZWN0LnNldFRlc3RIYXJuZXNzKHRoaXMpOwotCQlyZXR1cm4gYXBwbGljYXRpb24ucnVuKGFyZ3MpOwotCQkKLQl9Ci0JCi0JLyoKLQkgKiBJZiB3ZSBhcmUgaW4gcHJlLTMuMCBtb2RlLCB0aGVuIHRoZSBhcHBsaWNhdGlvbiB0byBydW4gaXMKLQkgKiAib3JnLmVjbGlwc2UudWkud29ya2JlbmNoIiBUaGVyZWZvcmUsIHdlIHNhZmVseSBjYXN0IHRoZSBydW5uYWJsZSBvYmplY3QKLQkgKiB0byBJV29ya2JlbmNoV2luZG93LiBXZSBhZGQgYSBsaXN0ZW5lciB0byBpdCwgc28gdGhhdCB3ZSBrbm93IHdoZW4gdGhlCi0JICogd2luZG93IG9wZW5zIHNvIHRoYXQgd2UgY2FuIHN0YXJ0IHJ1bm5pbmcgdGhlIHRlc3RzLiBXaGVuIHRoZSB0ZXN0cyBhcmUKLQkgKiBkb25lLCB3ZSBleHBsaWNpdGx5IGNhbGwgY2xvc2UoKSBvbiB0aGUgd29ya2JlbmNoLgotCSAqLwotCXByaXZhdGUgT2JqZWN0IHJ1bkRlcHJlY2F0ZWRBcHBsaWNhdGlvbigKLQkJSVBsYXRmb3JtUnVubmFibGUgb2JqZWN0LAotCQlmaW5hbCBPYmplY3QgYXJncykKLQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmFzc2VydFRydWUob2JqZWN0IGluc3RhbmNlb2YgSVdvcmtiZW5jaCk7Ci0KLQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSAoSVdvcmtiZW5jaCkgb2JqZWN0OwotCQkvLyB0aGUgJ3N0YXJ0ZWQnIGZsYWcgaXMgdXNlZCBzbyB0aGF0IHdlIG9ubHkgcnVuIHRlc3RzIHdoZW4gdGhlIHdpbmRvdwotCQkvLyBpcyBvcGVuZWQKLQkJLy8gZm9yIHRoZSBmaXJzdCB0aW1lIG9ubHkuCi0JCWZpbmFsIGJvb2xlYW5bXSBzdGFydGVkID0geyBmYWxzZSB9OwotCQl3b3JrYmVuY2guYWRkV2luZG93TGlzdGVuZXIobmV3IElXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChJV29ya2JlbmNoV2luZG93IHcpIHsKLQkJCQlpZiAoc3RhcnRlZFswXSkKLQkJCQkJcmV0dXJuOwotCQkJCXcuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc3RhcnRlZFswXSA9IHRydWU7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUVjbGlwc2VUZXN0UnVubmVyLm1haW4oKFN0cmluZ1tdKSBhcmdzKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQkJd29ya2JlbmNoLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJfQotCQkJcHVibGljIHZvaWQgd2luZG93RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJfQotCQl9KTsKLQkJcmV0dXJuICgoSVBsYXRmb3JtUnVubmFibGUpIHdvcmtiZW5jaCkucnVuKGFyZ3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRlc3RpbmcuSVRlc3RIYXJuZXNzI3J1blRlc3RzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5UZXN0cygpIHsKLQkJZlRlc3RhYmxlT2JqZWN0LnRlc3RpbmdTdGFydGluZygpOwotCQlmVGVzdGFibGVPYmplY3QucnVuVGVzdChuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRWNsaXBzZVRlc3RSdW5uZXIubWFpbihQbGF0Zm9ybS5nZXRDb21tYW5kTGluZUFyZ3MoKSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZUZXN0YWJsZU9iamVjdC50ZXN0aW5nRmluaXNoZWQoKTsKLQl9Ci0JCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC90ZXN0ZnJhbWV3b3JrLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnRlc3QvdGVzdGZyYW1ld29yay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI3YmVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UudGVzdC90ZXN0ZnJhbWV3b3JrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5FY2xpcHNlIFRlc3RpbmcgSW5zdHJ1Y3Rpb25zPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+VGhlIEVjbGlwc2UgVGVzdCBGcmFtZXdvcms8L2gxPgotPHA+TGFzdCBNb2RpZmllZDogRmViLiAyNiwgMjAwMzwvcD4KLTxwPjxmb250IHNpemU9IisxIj48YnI+Ci0gIEludHJvZHVjdGlvbjwvZm9udD48L3A+Ci08cD5UaGUgdGVzdGluZyBmcmFtZXdvcmsgaXMgY29tcHJpc2VkIG9mIHRoZSBvcmcuZWNsaXBzZS50ZXN0IHBsdWdpbiBhbmQgdGhlIG9yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdCAKLSAgZnJhZ21lbnQuIDwvcD4KLTxwPlRoZXNlIHR3byBwcm9qZWN0cyBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIGRldi5lY2xpcHNlLm9yZyByZXBvc2l0b3J5IGFuZCBhcmUgCi0gIGluY2x1ZGVkIGluIHRoZSBlY2xpcHNlLUF1dG9tYXRlZC1UZXN0cy4mbHQ7YnVpbGRpZCZndDsuemlwIGZyb20gdGhlIGVjbGlwc2Uub3JnIAotICBkb3dubG9hZHMgcGFnZS48L3A+Ci08cD48Zm9udCBzaXplPSIrMSI+QnVpbGRpbmcgYW5kIEluc3RhbGxhdGlvbjwvZm9udD48L3A+Ci08cD5TaW5jZSB0aGUgb3JnLmVjbGlwc2UudGVzdCBwbHVnaW4gaXMgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5IGluIHNvdXJjZS1jb2RlIAotICBmb3JtLCBpdCBuZWVkcyB0byBiZSBjb21waWxlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQuIFRoZSBvcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXQgCi0gIGZyYWdtZW50IGRvZXMgbm90IGNvbnRhaW4gYW55IHNvdXJjZSBhbmQgY2FuIGJlIHVzZWQgYXMgaXMgZnJvbSB0aGUgcmVwb3NpdG9yeS48L3A+Ci08b2w+Ci0gIDxsaT5UdXJuIG9mIGF1dG9tYXRpYyBidWlsZHMuIFdpbmRvdy0+UHJlZmVyZW5jZXMtPldvcmtiZW5jaCBhbmQgdW5jaGVjayAiUGVyZm9ybSAKLSAgICBidWlsZCBhdXRvbWF0aWNhbGx5IG9uIHJlc291cmNlIG1vZGlmaWNhdGlvbiI8L2xpPgotICA8bGk+TG9hZCBvcmcuZWNsaXBzZS50ZXN0IGludG8geW91ciB3b3Jrc3BhY2UuPC9saT4KLSAgPGxpPlJpZ2h0LWNsaWNrIG9uIHRoZSBvcmcuZWNsaXBzZS50ZXN0IHByb2plY3QgaW4gZWl0aGVyIHRoZSBOYXZpZ2F0b3Igb3IgUGFja2FnZXMgCi0gICAgdmlldy4gU2VsZWN0ICdSZWJ1aWxkIFByb2plY3QnIGZyb20gdGhlIGNvbnRleHQgbWVudS4gVGhpcyB3aWxsIGNvbXBpbGUgdGhlIAotICAgIGVudGlyZSBvcmcuZWNsaXBzZS50ZXN0IHBsdWdpbi48L2xpPgotICA8bGk+RmluYWxseSwgY29weSB0aGUgb3JnLmVjbGlwc2UudGVzdCBwbHVnaW4gaW50byB5b3VyIHRhcmdldCBFY2xpcHNlLjwvbGk+Ci0gIDxsaT5UaGUgb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0IGZyYWdtZW50IG9ubHkgbmVlZHMgdG8gYmUgcHJlc2VudCBpbiAKLSAgICB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIEVjbGlwc2UgdGhhdCBpcyBvdmVyc2VlaW5nIHRoZSB0ZXN0IHByb2Nlc3MuIElmIHlvdSAKLSAgICBhcmUgcnVubmluZyB0aGUgdGVzdCBzY3JpcHQgZnJvbSB3aXRoaW4gdGhlIFdvcmtiZW5jaCwgdGhpcyBtZWFucyB0aGF0IHRoZSAKLSAgICBmcmFnbWVudHMgbmVlZCB0byBiZSBwcmVzZW50IHdpdGhpbm4geW91ciBkZXZlbG9wbWVudCBFY2xpcHNlLiBJZiB5b3UgYXJlIAotICAgIHJ1bm5pbmcgdGhlIHRlc3RzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgdGhlbiB0aGUgZnJhZ21lbnRzIHdpbGwgbmVlZCB0byBiZSAKLSAgICBwcmVzZW50IGluIHlvdXIgdGFyZ2V0IEVjbGlwc2UuPC9saT4KLTwvb2w+Ci08cD48Zm9udCBzaXplPSIrMSI+U2V0dXA8L2ZvbnQ+PC9wPgotPHA+Rm9sbG93IHRoZSBzdGVwcyBnaXZlbiBhYm92ZSB0byBidWlsZCBhbmQgaW5zdGFsbCBhbGwgb2YgdGhlIG5lY2Nlc3NhcnkgcGx1Z2lucyAKLSAgYW5kIGZyYWdtZW50cy4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSB0ZXN0IGZyYW1ld29yayBpcyAKLSAgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgUERFIG5vdGlvbiBvZiBzZWxmLWhvc3RpbmcuIElmIHlvdSB3YW50IHRvIHJ1biB0aGUgdGVzdHMsIAotICB5b3Ugd2lsbCBuZWVkIHRvIHNldHVwIGEgZnVsbCB0YXJnZXQgRWNsaXBzZSBzbyB0aGF0IHRoZSB0ZXN0aW5nIGZyYW1ld29yayBjYW4gCi0gIGRldGVjdCBldmVyeXRoaW5nIHRoYXQgaXMgbmVlZGVkLjwvcD4KLQotPHA+SWYgeW91IGFyZSB3cml0aW5nIHRlc3RzIGZvciBvbmUgb3IgbW9yZSBFY2xpcHNlIHBsdWdpbnMsIHRoZW4geW91IHNob3VsZAotY3JlYXRlIGEgc2VwYXJhdGUgcGx1Z2luIGZvciB0ZXN0cy4gVGhlIHRlc3QgcGx1Z2luIHdpbGwgY29udGFpbiBhbGwgb2YgdGhlCi10ZXN0cyB0aGF0IHdpbGwgYmUgcnVuIG9uIHlvdXIgZGV2ZWxvcG1lbnQgcGx1Z2lucywgYXMgd2VsbCBhcyBkZWZpbmluZyBob3cKLXRob3NlIHRlc3RzIGdldCBydW4uPC9wPgotCi08cD5JZiB5b3UgYXJlIG5vdCB3cml0aW5nIHRlc3RzIGZvciBhbiBFY2xpcHNlIHBsdWdpbiwgdGhlbiB5b3Ugc2hvdWxkIGxvb2sgaW50byAKLSAgdXNpbmcgSlVuaXQgb24gaXRzIG93biB0byB0ZXN0IHlvdXIgd29yay4gSlVuaXQgaXMgZGVzaWduZWQgZm9yIHRlc3RpbmcgSmF2YSAKLSAgY29kZSwgYW5kIGJ5IGRlZmF1bHQgaGFzIG5vIGtub3dsZWRnZSBvZiBFY2xpcHNlLiBUaGVyZSBhcmUgc2VwYXJhdGUgbWVjaGFuaXNtcyAKLSAgZm9yIHVzaW5nIEpVbml0IG9uIEphdmEgY29kZSBpbiBFY2xpcHNlLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgaGVyZTo8L3A+Ci08cD4gPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9qZHQtdWktaG9tZS9wbHVnaW5zL29yZy5lY2xpcHNlLmpkdC5qdW5pdC9pbmRleC5odG1sIj5KVW5pdCAKLSAgU3VwcG9ydCBpbiBFY2xpcHNlPC9hPjxicj4KLSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZzo4MDgwL2hlbHAvY29udGVudC9oZWxwOi9vcmcuZWNsaXBzZS5qZHQuZG9jLnVzZXIvdGFza3MvdGFza3MtMjA3Lmh0bT9yZXN1bHRvZj0lNmElNzUlNmUlNjklNzQlMjAmdG9jPSUyRm9yZy5lY2xpcHNlLmpkdC5kb2MudXNlciUyRnRvYy54bWwiPlVzaW5nIAotICBKVW5pdDwvYT48L3A+Ci0KLTxwPk9uY2UgYSB0ZXN0IHBsdWdpbiBoYXMgYmVlbiBjcmVhdGVkLCB5b3UgbXVzdCB0aGVuIGNyZWF0ZSBhbiBBbnQgc2NyaXB0IHRoYXQgCi0gIHdpbGwgcnVuIGFsbCBvZiB0aGUgdGVzdHMuIENyZWF0ZSBhIGZpbGUgY2FsbGVkICd0ZXN0LnhtbCcsIHdoaWNoIGlzIGEgc2libGluZyAKLSAgb2YgJ3BsdWdpbi54bWwnLiBUaGlzIGZpbGUgZGVmaW5lcyBob3cgZWFjaCB0ZXN0IGlzIGdvaW5nIHRvIGJlIHJ1bi4gVGhlICd0ZXN0LnhtbCcgCi0gIGZpbGUgaXMgbGlrZSBhIERPUyBiYXRjaCBmaWxlIHRoYXQgc2NyaXB0cyB0aGUgZW50aXJlIHRlc3RpbmcgcHJvY2Vzcy4gVHlwaWNhbGx5LCAKLSAgdGhlICd0ZXN0LnhtbCcgZmlsZSB3aWxsIGNvbnRhaW4gdGFyZ2V0cyBmb3Igc2V0dGluZyB1cCB0aGUgdGVzdCBydW4sIGV4ZWN1dGluZyAKLSAgdGhlIHRlc3RzLCBjbGVhbmluZyB1cCBhZnRlcndhcmRzLCBhbmQgcnVubmluZyB0aGUgZW50aXJlIHByb2Nlc3MuPC9wPgotPHA+Jm5ic3A7PC9wPgotPHA+PGZvbnQgc2l6ZT0iKzEiPkNvbnZlcnRpbmcgZXhpc3RpbmcgVGVzdCBTdWl0ZXM8L2ZvbnQ+PC9wPgotCi08cD5JZiB5b3UgYXJlIGNvbnZlcnRpbmcgYW4gZXhpc3Rpbmcgc2V0IG9mIHRlc3RzIHRvIHVzZSB0aGUgbmV3IGZyYW1ld29yaywgdGhlCi1hY3R1YWwgdGVzdHMgdGhhdCBoYXZlIGJlZW4gd3JpdHRlbiBzaG91bGQgbm90IG5lZWQgbXVjaCBjaGFuZ2UuPC9wPgotCi08cD5JZiB5b3UgaGF2ZSB0ZXN0cyBpbiBtdWx0aXBsZSBwbHVnaW5zLCBpdCBpcyBoZWxwZnVsIHRvIGRlc2lnbmF0ZSBvbmUgcGx1Z2luCi1hcyB0aGUgbWFpbiBwbHVnaW4gZm9yIHlvdXIgY29tcG9uZW50LiBUaGlzIGNhbiBiZSBvbmUgb2YgeW91ciBleGlzdGluZwotcGx1Z2lucywgb3IgaXQgY2FuIGJlIGEgbmV3IHBsdWdpbiwgY3JlYXRlZCBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgcHVycG9zZS4gWW91cgotbWFpbiBwbHVnaW4gaXMgdGhlIG9ubHkgcGx1Z2luIHRoYXQgbmVlZHMgdG8gY29udGFpbiBhICd0ZXN0LnhtbCcgc2NyaXB0LiBUaGlzCi1zY3JpcHQgY2FuIGludm9rZSB0aGUgdGVzdHMgaW4gZWFjaCBvZiB5b3VyIG90aGVyIHBsdWdpbnMsIHNvIHRoZXJlIGlzIG5vIG5lZWQKLWZvciBtdWx0aXBsZSBzY3JpcHRzLiBZb3VyIG1haW4gcGx1Z2luIGRvZXMgbm90IG5lZWQgdG8gZGVwZW5kIG9uIHlvdXIgb3RoZXIKLXBsdWdpbnMgYXQgYWxsLjwvcD4KLQotPHA+TWFrZSBzdXJlIHRoYXQgdGhlIHRlc3RzIGFyZSBkZWZpbmVkIGluIGEgcGx1Z2luLiBUaGlzIGlzIHByb2JhYmx5IHRoZSBtb3N0IAotICBjb21tb24gY2F1c2Ugb2YgY29uZnVzaW9uIGluIHRoZSBlbnRpcmUgdGVzdCBwcm9jZXNzLiBZb3VyIHRlc3RzIG5lZWQgdG8gYmUgCi0gIGluIGEgcGx1Z2luIHNvIHRoYXQgRWNsaXBzZSBjYW4gZmluZCB0aGVtIHdoZW4gaXQgdHJpZXMgdG8gbG9hZCB0aGVtLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxwPjxmb250IHNpemU9IisxIj5DcmVhdGluZyBuZXcgVGVzdCBTdWl0ZXM8L2ZvbnQ+PC9wPgotPHA+Q3JlYXRpbmcgbmV3IEpVbml0IHRlc3RzIGZvciBhbiBFY2xpcHNlIHBsdWdpbiBzaG91bGQgYmUgbm8gbW9yZSBkaWZmaWN1bHQgCi0gIHRoYW4gd3JpdGluZyBzdGFuZGFyZCBKVW5pdCB0ZXN0cy4gU2luY2UgdGhlIGZyYW1ld29yayBhbGxvd3MgdGVzdHMgdG8gYmUgcnVuIAotICBpbnNpZGUgb2YgYSB3b3JraW5nIEVjbGlwc2UsIGFueSB0ZXN0cyB0aGF0IHlvdSB3cml0ZSBoYXZlIGF2YWlsYWJsZSB0byB0aGVtIAotICBhbnkgb2YgdGhlIG1ldGhvZHMgc3VwcGxpZWQgYnkgdGhlIEVjbGlwc2UgcGxhdGZvcm0sIHByb3ZpZGVkIHRoYXQgeW91IGFkZCB0aGUgCi0gIGFwcHJvcHJpYXRlIGRlcGVuZGVuY2llcyB0byB5b3VyIHRlc3RzJyAncGx1Z2luLnhtbCcuPC9wPgotPHA+Jm5ic3A7PC9wPgotPHA+PGZvbnQgc2l6ZT0iKzEiPlBlcmZvcm1hbmNlIElzc3VlczwvZm9udD48L3A+Ci08cD5Zb3Ugc2hvdWxkIGtlZXAgaW4gbWluZCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgRWNsaXBzZSBuZWVkcyB0byBiZQotc3RhcnRlZC4gTGF1bmNoaW5nIEVjbGlwc2UgaGFzIGEgc3Vic3RhbnRpYWwgY29zdCBpbiB0ZXJtcyBvZiBydW50aW1lLiBUbwotbWluaW1pemUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgcGxhdGZvcm0gaXMgc3RhcnRlZCwgeW91IHNob3VsZCBjb25zaWRlcgotd3JpdGluZyBhIFRlc3RTdWl0ZSBjYWxsZWQgQWxsVGVzdHMgZm9yIGVhY2ggb2YgeW91ciB0ZXN0IHBsdWdpbnMuIEFsbFRlc3RzCi1zaG91bGQgaW52b2tlIGVhY2ggb2YgdGhlIHRlc3RzIHRoYXQgeW91IHdhbnQgdG8gcnVuIGZvciBhIHBhcnRpY3VsYXIgcGx1Z2luLgotVGhlICd0ZXN0LnhtbCcgZmlsZSBjYW4gdGhlbiBydW4gdGhlIEFsbFRlc3RzIGNsYXNzLCB3aGljaCB3aWxsIHJ1biBhbGwgb2YgeW91cgotdGVzdHMsIGJ1dCB0aGUgcGxhdGZvcm0gd2lsbCBvbmx5IGV2ZXIgYmUgc3RhcnRlZCBvbmNlIGZvciBlYWNoIG9mIHlvdXIgdGVzdAotcGx1Z2lucy48L3A+Ci0KLTxwPk5vdGU6IFNvbWV0aW1lcyB0ZXN0cyBpbnZvbHZlIHNodXR0aW5nIGRvd24sIHJlc3RhcnRpbmcsIGFuZCB0ZXN0aW5nIHRoZSBzdGF0ZSAKLSAgb2YgbWV0YWRhdGEgdGhhdCB3YXMgd3JpdHRlbiB0byBkaXNrLiBUaGVzZSBzZXNzaW9uIHRlc3RzIHdpbGwgcmVxdWlyZSBFY2xpcHNlIAotICB0byBiZSBsYXVuY2hlZCBzZXZlcmFsIHRpbWVzIGluIHNlcXVlbmNlLCB3aGljaCB3aWxsIGluY3JlYXNlIHRoZSBydW50aW1lIG9mIAotICB5b3VyIHRlc3RzLiBUaGlzIGNhbm5vdCBiZSBhdm9pZGVkLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxwPjxmb250IHNpemU9IisxIj5SdW5uaW5nIHRoZSBUZXN0IFN1aXRlIGZyb20gdGhlIFVJPC9mb250PjwvcD4KLTxwPlJpZ2h0IGNsaWNrIG9uIHRoZSB0ZXN0LnhtbCBmaWxlIGFuZCBzZWxlY3QgJ1J1biBBbnQuLi4nIGZyb20gdGhlIHB1bGwtZG93biAKLSAgbWVudS4gVGhlIFJ1bm5pbmcgQW50IGRpYWxvZyBib3ggcG9wcyB1cC4gRnJvbSB0aGUgbGlzdCBvZiB0YXJnZXRzLCBzZWxlY3QgdGhlIAotICBvbmUgdGhhdCBydW5zIGFsbCBvZiB5b3VyIHRlc3RzLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBleGFtcGxlIGZpbGUgcHJvdmlkZWQgCi0gIGJlbG93LCB0aGlzIHRhcmdldCBpcyBjYWxsZWQgJ1J1bicsIGFuZCB3aWxsIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQuIEhpdCB0aGUgCi0gICdGaW5pc2gnIGJ1dHRvbiB0byBzdGFydCB0aGUgdGVzdCBwcm9jZXNzLjwvcD4KLTxwPjxmb250IHNpemU9IisxIj5SdW5uaW5nIHRoZSBUZXN0IFN1aXRlIGZyb20gdGhlIGNvbW1hbmQgbGluZTwvZm9udD48L3A+Ci08cD5XaGVuIHRoZSB0ZXN0IHN1aXRlcyBhcmUgaW52b2tlZCBhdXRvbWF0aWNhbGx5LCB0aGV5IGFyZSBydW4gZnJvbSBjb21tYW5kCi1saW5lLiBGcm9tIHRoZSAke2VjbGlwc2UtaG9tZX0gZGlyZWN0b3J5LCB0aGUgY29tbWFuZCB0byB1c2UgaXM6PC9wPgotCi08Y29kZT5qYXZhIC1jcAotc3RhcnR1cC5qYXIgb3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5VSU1haW4gLWFwcGxpY2F0aW9uCi1vcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRSdW5uZXIgLWJ1aWxkZmlsZSAke3Rlc3QtcGx1Z2luLXBhdGh9XHRlc3QueG1sCi0tRGVjbGlwc2UtaG9tZT0ke2VjbGlwc2UtaG9tZX08L2NvZGU+Ci0KLTxwPkluZGl2aWR1YWwgdGVzdHMgY2FuIGFsc28gYmUgaW52b2tlZCBkaXJlY3RseS4gRnJvbSB0aGUgJHtlY2xpcHNlLWhvbWV9Ci1kaXJlY3RvcnksIHVzZSB0aGUgY29tbWFuZDo8L3A+Ci0KLTxjb2RlPmphdmEgLWNwIHN0YXJ0dXAuamFyIG9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXIuVUlNYWluIC1hcHBsaWNhdGlvbiAke2xhdW5jaGVyfSAKLS1kZXYgYmluIC10ZXN0bGlzdGVuZXIgb3JnLmVjbGlwc2UudGVzdC5YTUxUZXN0TGlzdGVuZXIgLXRlc3RwbHVnaW5uYW1lICR7cGx1Z2luLW5hbWV9IAotLWNsYXNzbmFtZSAke3Rlc3QtY2xhc3NuYW1lfTwvY29kZT4gCi08cD53aGVyZSAke2xhdW5jaGVyfSBpcyBvbmUgb2Y6IDxpPm9yZy5lY2xpcHNlLnRlc3QudWl0ZXN0YXBwbGljYXRpb248L2k+IG9yIDxpPm9yZy5lY2xpcHNlLnRlc3QuY29yZXRlc3RhcHBsaWNhdGlvbjwvaT4gCi0gIGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdCB5b3Ugd2FudCB0byBydW4geW91ciB0ZXN0cyB3aXRoaW4gYW4gYWN0aXZlIFdvcmtiZW5jaC48L3A+Ci08cD48Zm9udCBzaXplPSIrMSI+T3V0cHV0PC9mb250PjwvcD4KLQotPHA+QnkgZGVmYXVsdCwgb3V0cHV0IGZyb20gZWFjaCB0ZXN0IHJ1biBpcyBsb2dnZWQgYXMgWE1MLiBGb3IgZWFjaCB0ZXN0IHRoYXQgCi0gIGlzIHJ1biwgdGhlIG91dHB1dCBpcyBsb2dnZWQgaW50byB0aGUgZmlsZSBjYWxsZWQgJHtjbGFzc25hbWV9LnhtbC4gVGhlIGluZGl2aWR1YWwgCi0gIFhNTCBmaWxlcyBhcmUgbG9jYXRlZCBpbiB0aGUgJHtlY2xpcHNlLWhvbWV9IGRpcmVjdG9yeS4gV2hlbiB0aGUgdGVzdCBydW4gaXMgCi0gIGZpbmlzaGVkLCB5b3UgY2FuIGNhbGwgdGhlIDxiPiZxdW90O2NvbGxlY3QmcXVvdDs8L2I+IHRhcmdldCBpbiB0aGUgbGlicmFyeSAKLSAgZmlsZSwgd2hpY2ggd2lsbCBjb2xsZWN0IHRoZSBYTUwgaW50byBhIHNpbmdsZSBmaWxlLiBTZWUgYmVsb3cgZm9yIGFuIGV4YW1wbGUgCi0gIG9mIGhvdyB0byB1c2UgdGhpcyB0YXJnZXQgY29ycmVjdGx5LjwvcD4KLQotPHA+VGhlIEpVbml0IGludGVncmF0aW9uIGluIEVjbGlwc2Ugc3VwcG9ydHMgdmFyaW91cyBhZHZhbmNlZCBmZWF0dXJlcywgc3VjaCBhcwotPGI+UmVncmVzc2lvbiBUZXN0aW5nPC9iPiwgPGI+RW1haWwgTm90aWZpY2F0aW9uPC9iPiwgYW5kIDxiPkhUTUwgT3V0cHV0PC9iPi4KLVRoZXNlIGZlYXR1cmVzIGFyZSBjdXJyZW50bHkgdW5kZXIgZGV2ZWxvcG1lbnQsIGFuZCBkbyBub3QgeWV0IGhhdmUgYQotc3RhbmRhcmRpemVkIHdheSB0byBhZGQgdGhlbSB0byBhIHRlc3QgcnVuLjwvcD4KLQotPGgzPk90aGVyIGlzc3VlczwvaDM+Ci0KLTxoND5IZWFkbGVzcyBUZXN0aW5nIHZzLiBVSSB0ZXN0aW5nPC9oND4KLQotPHA+TWFueSBwbHVnaW4gdGVzdHMgd2lsbCBub3QgbmVlZCB0aGUgV29ya2JlbmNoIGFjdGl2ZSBpbiBvcmRlciB0byBydW4uIEluZGVlZCwgCi0gIG9ubHkgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHBsdWdpbnMgbmVlZGVkIHRvIHJ1biB0aGUgcGx1Z2luIGJlaW5nIHRlc3RlZCBuZWVkIAotICB0byBiZSBwcmVzZW50IHdoZW4gdGVzdGluZyBpbiBhIHRhcmdldCBFY2xpcHNlLiBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBBbnQgCi0gIHRhcmdldHMgcHJvdmlkZWQgZm9yIHJ1bm5pbmcgRWNsaXBzZSBwbHVnaW4gdGVzdHMuIE9uZSB0YXJnZXQgc3RhcnRzIHRoZSBlbnRpcmUgCi0gIFdvcmtiZW5jaC4gVGhlIG90aGVyIHN0YXJ0cyBFY2xpcHNlIHdpdGggdGhlIG1pbmltdW0gbnVtYmVyIG9mIHBsdWdpbnMgbmVlZGVkLiAKLSAgSXQgaXMgdXAgdG8geW91IHRvIGRlY2lkZSB3aGljaCB0YXJnZXQgaXMgbW9zdCBhcHByb3ByaWF0ZS4gRm9yIGV4YW1wbGVzLCBsb29rIAotICBhdCB0aGUgPGI+JnF1b3Q7dWktdGVzdCZxdW90OzwvYj4gYW5kIDxiPiZxdW90O2NvcmUtdGVzdCZxdW90OzwvYj4gdGFyZ2V0cyBiZWxvdy48L3A+Ci0KLTxoND5EaXNwb3NpbmcgdGhlIERpc3BsYXk8L2g0PgotCi08cD5Tb21lIGxvdy1sZXZlbCB0ZXN0cyBmb3IgdGhlIEVjbGlwc2UgcGxhdGZvcm0gdGFrZSBhY3Rpb25zIHRoYXQgYXJlIG5vdAotbm9ybWFsbHkgcG9zc2libGUgaW5zaWRlIG9mIEVjbGlwc2UuIEFuIGV4YW1wbGUgb2YgdGhpcyBiZWhhdmlvdXIgd291bGQgYmUKLWRpc3Bvc2luZyB0aGUgZGlzcGxheS4gV2hpbGUgdGhpcyBhY3Rpb24gY2FuIGJlIHBlcmZvcm1lZCB3aGlsZSBydW5uaW5nIHRoZSBVSSwKLWl0IHdpbGwgYWxzbyBraWxsIHRoZSBVSSBmb3IgdGhlIGNvcHkgb2YgRWNsaXBzZSB0aGF0IGlzIHJ1bm5pbmcsIGFuZCBjYXVzZQotZXJyb3JzIHdoZW4gdGhlIFdvcmtiZW5jaCB0cmllcyB0byBzaHV0ZG93bi4gSWYgeW91IG5lZWQgdG8gdGVzdCBkaXNwb3NpbmcgdGhlCi1kaXNwbGF5LCBvciBvdGhlciBzaW1pbGFyIGFjdGlvbnMsIHlvdXIgdGVzdHMgc2hvdWxkIGJlIHJ1bm5pbmcgd2l0aG91dCBhIFVJLiA8L3A+Ci0KLTxoND5UZXN0cyB0aGF0IGFyZSBub3QgcGx1Z2luczwvaDQ+Ci0KLTxwPkl0IGlzIHZlcnkgZWFzeSB0byBmb3JnZXQgdG8gZGVmaW5lIHlvdXIgdGVzdHMgaW5zaWRlIG9mIGEgcGx1Z2luLiBJZiB5b3VyIAotICB0ZXN0cyB3aWxsIG5vdCBsb2FkIHByb3Blcmx5LCBtYWtlIHN1cmUgdGhhdCBhICdwbHVnaW4ueG1sJyBmaWxlIGV4aXN0cyBpbiB5b3VyIAotICB0ZXN0IHByb2plY3QsIGFuZCBhbHNvIHRoYXQgdGhlIHBsdWdpbiBpcyBiZWluZyBsb2FkZWQgYnkgdGhlIHBsYXRmb3JtLiBNYWtlIAotICBzdXJlIHRoYXQgYWxsIG9mIHRoZSBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBmb3IgeW91ciB0ZXN0IHBsdWdpbi48L3A+Ci08cD48Zm9udCBzaXplPSIrMSI+SW50ZXJmYWNlPC9mb250PjwvcD4KLQotPHA+VGhlIG9yZy5lY2xpcHNlLnRlc3QgcGx1Z2luIGRlZmluZXMgbWFueSB1c2VmdWwgQW50IHRhc2tzL3RhcmdldHMgdG8gYWlkIGRldmVsb3BlcnMgCi0gIGluIHdyaXRpbmcgdGhlaXIgdGVzdC54bWwgc2NyaXB0cy4gQ3VycmVudGx5LCB0aGVyZSBpcyBvbmx5IEFudCB0YXJnZXRzIGRlZmluZWQsIAotICB3aGljaCBjYW4gYmUgY2FsbGVkIHVzaW5nIEFudCdzIGJ1aWx0LWluICZsdDthbnQmZ3Q7IHRhc2suIFRvIHVzZSB0aGVzZSB0YXJnZXRzLCAKLSAgYWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byB0aGUgdG9wIG9mIHlvdXIgc2NyaXB0LCBhbmQgcmVmZXJlbmNlIHRoZSAke2xpYnJhcnktZmlsZX0gCi0gIHByb3BlcnR5IHdoZW4gY2FsbGluZyAmbHQ7YW50Jmd0Ozo8L3A+Ci0KLTxjb2RlPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2xpYnJhcnktZmlsZSZxdW90OwotdmFsdWU9JnF1b3Q7JHtlY2xpcHNlLWhvbWV9L2ZyYWdtZW50cy9vcmcuZWNsaXBzZS50ZXN0L2xpYnJhcnkueG1sJnF1b3Q7LyZndDsgPC9jb2RlPgotCi08cD5UaGUgdGFyZ2V0cyB0aGF0IGFyZSBkZWZpbmVkIGFyZTogPC9wPgotCi08dWw+Ci0gIDxsaT48Yj51aS10ZXN0PC9iPiAtIFRoaXMgdGFyZ2V0IHJ1bnMgYSBKVW5pdCB0ZXN0IHN1aXRlIGluc2lkZSBvZiBhbiBFY2xpcHNlIAotICAgIFdvcmtiZW5jaC4gVGhpcyB0YXJnZXQgaXMgbWFpbmx5IGZvciB0ZXN0aW5nIHBsdWdpbnMgdGhhdCB1c2UgdGhlIEVjbGlwc2UgCi0gICAgVUkgYW5kIEpGYWNlLiBUaGUgb3V0cHV0IG9mIHRoZSB0ZXN0IHBhc3MgaXMgYXV0b21hdGljYWxseSBsb2dnZWQgaW4gYW4gWE1MIAotICAgIGZpbGUgY2FsbGVkICR7Y2xhc3NuYW1lfS54bWwuIEl0IHRha2VzIGZvdXIgYXJndW1lbnRzOiA8L2xpPgotIDx1bD4KLSAgPGxpPjxpPmRhdGEtZGlyPC9pPiAtIFRoZQotICAgICAgZGF0YSBkaXJlY3Rvcnkgb2YgdGhlIEVjbGlwc2UgdGhhdCBnZXRzIHJ1bjwvbGk+Ci0gIDxsaT48aT5wbHVnaW4tbmFtZTwvaT4gLQotICAgICAgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0aGF0IHRoZSB0ZXN0IHN1aXRlIGlzIGRlZmluZWQgaW48L2xpPgotICA8bGk+PGk+Y2xhc3NuYW1lPC9pPiAtCi0gICAgICBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCB0aGUgdGVzdCBzdWl0ZSBpcyBkZWZpbmVkIGluPC9saT4KLSAgPGxpPjxpPnZtYXJnczwvaT4gLSBBbgotICAgICAgb3B0aW9uYWwgYXJndW1lbnQgc3RyaW5nIHRvIHBhc3MgdG8gdGhlIFZNIHJ1bm5pbmcgdGhlIHRlc3RzPC9saT4KLSA8L3VsPgotCi08cD5Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcnVuIHRoZSB0ZXN0Ci1vcmcuZWNsaXBzZS5mb28uYmFyLk15VGVzdCBpbiB0aGUgcGx1Z2luIG9yZy5lY2xpcHNlLmZvbyBpbiBhIG5ldyBFY2xpcHNlCi13b3JrYmVuY2guIEl0IHBhc3NlcyB0aGUgc3RyaW5nICZxdW90Oy1EYmF6PXRydWUmcXVvdDsgdG8gdGhlIFZNLiBUaGUgRWNsaXBzZQotc3RvcmVzIGl0cyBtZXRhZGF0YSBpbiB0aGUgZGlyZWN0b3J5ICZxdW90O2RhdGEtZm9sZGVyJnF1b3Q7LiAKLQotPGNvZGU+PHByZT4KLSZsdDthbnQgdGFyZ2V0PSZxdW90O3VpLXRlc3QmcXVvdDsgYW50ZmlsZT0mcXVvdDske2xpYnJhcnktZmlsZX0mcXVvdDsgZGlyPSZxdW90OyR7ZWNsaXBzZS1ob21lfSZxdW90OyZndDsKLSAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7ZGF0YS1kaXImcXVvdDsgdmFsdWU9JnF1b3Q7ZGF0YS1mb2xkZXImcXVvdDsvJmd0OwotICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtwbHVnaW4tbmFtZSZxdW90OyB2YWx1ZT0mcXVvdDtvcmcuZWNsaXBzZS5mb28mcXVvdDsvJmd0OwotICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtjbGFzc25hbWUmcXVvdDsgdmFsdWU9JnF1b3Q7b3JnLmVjbGlwc2UuZm9vLmJhci5NeVRlc3QmcXVvdDsvJmd0OwotICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDt2bWFyZ3MmcXVvdDsgdmFsdWU9JnF1b3Q7LURiYXo9dHJ1ZSZxdW90Oy8mZ3Q7Ci0mbHQ7L2FudCZndDsKLTwvcHJlPjwvY29kZT4KLQotICA8bGk+PGI+Y29yZS10ZXN0PC9iPiAtIFRoaXMgdGFyZ2V0IHJ1bnMgYSBKVW5pdCB0ZXN0IHN1aXRlIGluc2lkZSBvZiBhbiBJUGxhdGZvcm1SdW5uYWJsZS4gCi0gICAgVGhpcyB0YXJnZXQgaXMgZm9yIHRlc3RpbmcgcGx1Z2lucyB0aGF0IHVzZSB0aGUgRWNsaXBzZSBwbGF0Zm9ybSwgYnV0IGRvIG5vdCAKLSAgICByZXF1aXJlIGEgVUkgdG8gYmUgcnVubmluZy4gVGhlIG91dHB1dCBvZiB0aGUgdGVzdCBwYXNzIGlzIGF1dG9tYXRpY2FsbHkgbG9nZ2VkIAotICAgIGluIGFuIFhNTCBmaWxlIGNhbGxlZCAke2NsYXNzbmFtZX0ueG1sLiBJdCB0YWtlcyBmb3VyIGFyZ3VtZW50czogPC9saT4KLSA8dWw+Ci0gIDxsaT48aT5kYXRhLWRpcjwvaT4gLSBUaGUKLSAgICAgIGRhdGEgZGlyZWN0b3J5IG9mIHRoZSBFY2xpcHNlIHRoYXQgZ2V0cyBydW48L2xpPgotICA8bGk+PGk+cGx1Z2luLW5hbWU8L2k+IC0KLSAgICAgIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gdGhhdCB0aGUgdGVzdCBzdWl0ZSBpcyBkZWZpbmVkIGluPC9saT4KLSAgPGxpPjxpPmNsYXNzbmFtZTwvaT4gLQotICAgICAgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgdGhlIHRlc3Qgc3VpdGUgaXMgZGVmaW5lZCBpbjwvbGk+Ci0gIDxsaT48aT52bWFyZ3M8L2k+IC0gQW4KLSAgICAgIG9wdGlvbmFsIGFyZ3VtZW50IHN0cmluZyB0byBwYXNzIHRvIHRoZSBWTSBydW5uaW5nIHRoZSB0ZXN0czwvbGk+Ci0gPC91bD4KLQotPHA+Rm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHJ1biB0aGUgdGVzdAotb3JnLmVjbGlwc2UuZm9vLmJhci5NeVRlc3QgaW4gdGhlIHBsdWdpbiBvcmcuZWNsaXBzZS5mb28gaW4gYSBoZWFkbGVzcyBFY2xpcHNlLgotSXQgcGFzc2VzIHRoZSBzdHJpbmcgJnF1b3Q7LURiYXo9dHJ1ZSZxdW90OyB0byB0aGUgVk0uIFRoZSBFY2xpcHNlIHN0b3JlcyBpdHMKLW1ldGFkYXRhIGluIHRoZSBkaXJlY3RvcnkgJnF1b3Q7ZGF0YS1mb2xkZXImcXVvdDsuCi0KLTxjb2RlPjxwcmU+Ci0mbHQ7YW50IHRhcmdldD0mcXVvdDtjb3JlLXRlc3QmcXVvdDsgYW50ZmlsZT0mcXVvdDske2xpYnJhcnktZmlsZX0mcXVvdDsgZGlyPSZxdW90OyR7ZWNsaXBzZS1ob21lfSZxdW90OyZndDsKLSAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7ZGF0YS1kaXImcXVvdDsgdmFsdWU9JnF1b3Q7ZGF0YS1mb2xkZXImcXVvdDsvJmd0OwotICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtwbHVnaW4tbmFtZSZxdW90OyB2YWx1ZT0mcXVvdDtvcmcuZWNsaXBzZS5mb28mcXVvdDsvJmd0OwotICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtjbGFzc25hbWUmcXVvdDsgdmFsdWU9JnF1b3Q7b3JnLmVjbGlwc2UuZm9vLmJhci5NeVRlc3QmcXVvdDsvJmd0OwotICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDt2bWFyZ3MmcXVvdDsgdmFsdWU9JnF1b3Q7LURiYXo9dHJ1ZSZxdW90Oy8mZ3Q7Ci0mbHQ7L2FudCZndDsKLTwvcHJlPjwvY29kZT4KLQotIDxsaT48Yj5jb2xsZWN0PC9iPiAtIFRoaXMKLSAgICAgdGFyZ2V0IGNvbGxlY3RzIHRoZSBYTUwgZmlsZXMgdGhhdCBhcmUgcHJvZHVjZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZQotICAgICB0ZXN0IHNjcmlwdC4gSXQgdGFrZXMgdHdvIGFyZ3VtZW50czogPC9saT4KLSA8dWw+Ci0gIDxsaT48aT5pbmNsdWRlczwvaT4gLSBBCi0gICAgICBwYXR0ZXJuIG1hdGNoaW5nIGFsbCBYTUwgZmlsZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHRlc3QgcmVwb3J0LiBUaGlzCi0gICAgICBhcmd1bWVudCBpcyB0eXBpY2FsbHkgJnF1b3Q7b3JnKi54bWwmcXVvdDs8L2xpPgotICA8bGk+PGk+b3V0cHV0LWZpbGU8L2k+IC0KLSAgICAgIFRoZSBmaWxlbmFtZSB3aGVyZSB0aGUgb3V0cHV0IG9mIHRoZSB0ZXN0IGdldHMgc3RvcmVkLiBGb3IgdGhlIGF1dG9tYXRlZAotICAgICAgYnVpbGQgcHJvY2VzcywgdGhpcyBmaWxlIHNob3VsZCBiZSAke3BsdWdpbm5hbWV9LnhtbCwgYW5kIGJlIGxvY2F0ZWQgaW4KLSAgICAgIHRoZSBFQ0xJUFNFX0hPTUUgZGlyZWN0b3J5LjwvbGk+Ci0gPC91bD4KLQotPHA+Rm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSBjb2xsZWN0cyBhbGwgb2YgdGhlIGZpbGVzCi1tYXRjaGluZyB0aGUgcGF0dGVybiAmcXVvdDtvcmcqLnhtbCZxdW90OyBpbiB0aGUgZGlyZWN0b3J5ICR7ZWNsaXBzZS1ob21lfSwKLWludG8gdGhlIGZpbGUgbmFtZWQgJnF1b3Q7bG9nZmlsZS54bWwmcXVvdDsuCi0KLTxjb2RlPjxwcmU+Ci0mbHQ7YW50IHRhcmdldD0mcXVvdDtjb2xsZWN0JnF1b3Q7IGFudGZpbGU9JnF1b3Q7JHtsaWJyYXJ5LWZpbGV9JnF1b3Q7IGRpcj0mcXVvdDske2VjbGlwc2UtaG9tZX0mcXVvdDsmZ3Q7Ci0gICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2luY2x1ZGVzJnF1b3Q7IHZhbHVlPSZxdW90O29yZyoueG1sJnF1b3Q7LyZndDsKLSAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7b3V0cHV0LWZpbGUmcXVvdDsgdmFsdWU9JnF1b3Q7bG9nZmlsZS54bWwmcXVvdDsvJmd0OwotJmx0Oy9hbnQmZ3Q7Ci08L3ByZT48L2NvZGU+Ci0KLSAgPGxpPjxiPnRlc3QtcmVncmVzc2lvbnM8L2I+IC0gVGhpcyB0YXJnZXQgdGFrZXMgdHdvIGNvbXBvdW5kIFhNTCBmaWxlcyAoYWZ0ZXIgCi0gICAgYSBjb2xsZWN0IC0gZXZlbiBpZiBjb2xsZWN0IGlzIG9ubHkgZ2l2ZW4gMSBmaWxlKSwgYW5kIHByb2R1Y2VzIGEgdGV4dCBmaWxlIAotICAgIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0ZXN0IHN0YXR1cyBjaGFuZ2VzIHRoYXQgb2NjdXIgYmV0d2VlbiB0aGUgdHdvIAotICAgIGZpbGVzLiBJdCB3aWxsIHJlcG9ydCBuZXcgdGVzdHMgYWRkZWQsIG9sZCB0ZXN0cyB0aGF0IHdlcmVuJ3QgcnVuLCBhbmQgdGVzdHMgCi0gICAgd2hvc2Ugc3RhdHVzIGNoYW5nZWQgKHBhc3MgdG8gZmFpbCwgb3IgZmFpbCB0byBwYXNzKS4gVGhpcyB0YXJnZXQgdGFrZXMgdGhyZWUgCi0gICAgYXJndW1lbnRzOiA8L2xpPgotIDx1bD4KLSAgPGxpPjxpPm9sZGZpbGU8L2k+IC0gdGhlCi0gICAgICBiYXNlbGluZSBmaWxlIHRvIGNvbXBhcmUgYWdhaW5zdDwvbGk+Ci0gIDxsaT48aT5uZXdmaWxlPC9pPiAtIHRoZQotICAgICAgZmlsZSBjb250YWluaW5nIHRoZSByZXN1bHRzIG9mIHRoZSBtb3N0IHJlY2VudCB0ZXN0IHJ1bjwvbGk+Ci0gIDxsaT48aT5vdXRmaWxlPC9pPiAtIHRoZQotICAgICAgZmlsZSBpbiB3aGljaCB0byBwbGFjZSB0aGUgcmVzdWx0cyBvZiB0aGUgcmVncmVzc2lvbiB0ZXN0PC9saT4KLSA8L3VsPgotCi08cD5Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIGNvbXBhcmVzIHRoZSB0ZXN0IHJ1bnMgdGhhdAotd2VyZSBsb2dnZWQgaW50byB0aGUgZmlsZXMgJnF1b3Q7b2xkLnhtbCZxdW90OyBhbmQgJnF1b3Q7bmV3LnhtbCZxdW90OywgYW5kCi1jcmVhdGVzIGEgZmlsZSBjYWxsZWQgJnF1b3Q7b3V0cHV0LnR4dCZxdW90OyB0aGF0IGhvbGRzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCi10aGUgdHdvIHJ1bnMuCi0KLTxjb2RlPjxwcmU+Ci0mbHQ7YW50IHRhcmdldD0mcXVvdDt0ZXN0LXJlZ3Jlc3Npb25zJnF1b3Q7IGFudGZpbGU9JnF1b3Q7JHtsaWJyYXJ5LWZpbGV9JnF1b3Q7IGRpcj0mcXVvdDske2VjbGlwc2UtaG9tZX0mcXVvdDsmZ3Q7Ci0gICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O29sZGZpbGUmcXVvdDsgdmFsdWU9JnF1b3Q7b2xkLnhtbCZxdW90Oy8mZ3Q7Ci0gICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O25ld2ZpbGUmcXVvdDsgdmFsdWU9JnF1b3Q7bmV3LnhtbCZxdW90Oy8mZ3Q7Ci0gICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O291dGZpbGUmcXVvdDsgdmFsdWU9JnF1b3Q7b3V0cHV0LnR4dCZxdW90Oy8mZ3Q7Ci0mbHQ7L2FudCZndDsKLTwvcHJlPjwvY29kZT4KLQotIDxsaT48Yj5ub3RpZnk8L2I+IC0gVGhpcyB0YXJnZXQKLSAgICAgc2VuZHMgZW1haWwgbm90aWZpY2F0aW9uIG9mIHRoZSBzdGF0dXMgb2YgdGhlIGxhdGVzdCB0ZXN0IHJ1bi4gVHlwaWNhbGx5LAotICAgICB0aGlzIHNlbmRzIHRoZSByZXN1bHRzIG9mIHRoZSBsYXRlc3QgcmVncmVzc2lvbiB0ZXN0IHRvIGEgZGV2ZWxvcGVyIHNvCi0gICAgIHRoYXQgbmV3IHRlc3QgZmFpbHVyZXMgY2FuIGJlIGRldGVjdGVkIHF1aWNrbHkuIFRoaXMgdGFyZ2V0IHRha2VzIHR3bwotICAgICBwYXJhbWV0ZXJzOiA8L2xpPgotIDx1bD4KLSAgPGxpPjxpPmluZmlsZTwvaT4gLSB0aGUKLSAgICAgIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBzZW5kPC9saT4KLSAgPGxpPjxpPmFkZHJlc3M8L2k+IC0gdGhlCi0gICAgICBlbWFpbCBhZGRyZXNzIHRvIHNlbmQgdGhlIGZpbGUgdG88L2xpPgotIDwvdWw+Ci0KLTxwPkZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCBtYWlsIHRoZSBjb250ZW50cyBvZgotdGhlIGZpbGUgJnF1b3Q7b3V0cHV0LnR4dCZxdW90OyB0byB0aGUgYWRkcmVzcyAmcXVvdDtmb29AYmFyLmNvbSZxdW90Oy4gCi0KLTxjb2RlPjxwcmU+Ci0mbHQ7YW50IHRhcmdldD0mcXVvdDtub3RpZnkmcXVvdDsgYW50ZmlsZT0mcXVvdDske2xpYnJhcnktZmlsZX0mcXVvdDsgZGlyPSZxdW90OyR7ZWNsaXBzZS1ob21lfSZxdW90OyZndDsKLSAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7aW5maWxlJnF1b3Q7IHZhbHVlPSZxdW90O291dHB1dC50eHQmcXVvdDsvJmd0OwotICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDthZGRyZXNzJnF1b3Q7IHZhbHVlPSZxdW90O2Zvb0BiYXIuY29tJnF1b3Q7LyZndDsKLSZsdDsvYW50Jmd0OwotPC9wcmU+PC9jb2RlPgotPC91bD4KLQotPGgyPkV4YW1wbGVzOjwvaDI+Ci0KLTxwPkluY2x1ZGVkIGlzIHRoZSAndGVzdC54bWwnIGZpbGUgZnJvbSB0aGUgb3JnLmVjbGlwc2UudWkudGVzdHMgcGx1Z2luLiBUaGlzCi1maWxlIGNvbnRyb2xzIGFsbCBvZiB0aGUgYXV0b21hdGVkIHRlc3RpbmcgdGhhdCBpcyBkb25lIGZvciB0aGUgb3JnLmVjbGlwc2UudWkKLXBsdWdpbi4gSXQgY2FuIGJlIHJ1biBmcm9tIGluc2lkZSBvZiBFY2xpcHNlIG9yIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gSXQgaXMKLWludGVuZGVkIHRvIHNlcnZlIGFzIGEgdGVtcGxhdGUgZmlsZSBmb3IgdGVzdGluZyBhbnkgb3RoZXIgcGx1Z2luLjwvcD4KLQotPHA+Tm90aWNlIHRoYXQgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZmlsZSByb3VnaGx5IG1pcnJvcnMgdGhhdCBvZiBhIEpVbml0IHRlc3QuCi1UYXJnZXRzIGFyZSBkZWZpbmVkIGZvciBzZXR0aW5nIHVwIHRoZSB0ZXN0cywgZGVmaW5pbmcgd2hhdCBuZWVkcyB0byBiZSBkb25lLAotY2xlYW5pbmcgdXAgYWZ0ZXIgdGhlIHRlc3RzLCBhbmQgcnVubmluZyBldmVyeXRoaW5nIGluIHRoZSByaWdodCBvcmRlci48L3A+Ci0KLTxmb250IGNvbG9yPSJyZWQiPlRoaXMgZXhhbXBsZSBpcyBvdXQgb2YgZGF0ZS4KLTxjb2RlPjxwcmU+Ci0mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLQotJmx0O3Byb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iJmd0OwotICAmbHQ7IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tJmd0OwotICAmbHQ7IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tJmd0OwotICAmbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLiIvJmd0OwotCi0gICZsdDshLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0mZ3Q7Ci0gICZsdDtwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzIi8mZ3Q7Ci0gICZsdDtwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiCi0gICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2ZyYWdtZW50cy9vcmcuZWNsaXBzZS50ZXN0L2xpYnJhcnkueG1sIi8mZ3Q7Ci0KLSAgJmx0OyEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tJmd0OwotICAmbHQ7IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tJmd0OwotICAmbHQ7IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLSZndDsKLSAgJmx0O3RhcmdldCBuYW1lPSJpbml0IiZndDsKLSAgICAmbHQ7dHN0YW1wLyZndDsKLSAgICAmbHQ7ZGVsZXRlJmd0OwotICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvJmd0OwotICAgICZsdDsvZGVsZXRlJmd0OwotICAmbHQ7L3RhcmdldCZndDsKLQotICAmbHQ7IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tJmd0OwotICAmbHQ7dGFyZ2V0IG5hbWU9InN1aXRlIiZndDsKLSAgICAmbHQ7cHJvcGVydHkgbmFtZT0ic2Vzc2lvbi1mb2xkZXIiIAotICAgICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3VpX3Nlc3Npb25fc25pZmZfZm9sZGVyIi8mZ3Q7Ci0gICAgJmx0O2RlbGV0ZSBkaXI9IiR7c2Vzc2lvbi1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvJmd0OwotICAgICZsdDthbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9IiZndDsKLSAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7c2Vzc2lvbi1mb2xkZXJ9Ii8mZ3Q7Ci0gICAgICAmbHQ7cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvJmd0OwotICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgCi0gICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLmFwaS5TZXNzaW9uQ3JlYXRlVGVzdCIvJmd0OwotICAgICZsdDsvYW50Jmd0OwotICAgICZsdDthbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9IiZndDsKLSAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7c2Vzc2lvbi1mb2xkZXJ9Ii8mZ3Q7Ci0gICAgICAmbHQ7cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvJmd0OwotICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UudWkudGVzdHMuYXBpLlNlc3Npb25SZXN0b3JlVGVzdCIvJmd0OwotICAgICZsdDsvYW50Jmd0OwotCi0gICAgJmx0O3Byb3BlcnR5IG5hbWU9InNuaWZmLWZvbGRlciIKLSAgICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS91aV9zbmlmZl9mb2xkZXIiLyZndDsKLSAgICAmbHQ7ZGVsZXRlIGRpcj0iJHtzbmlmZi1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvJmd0OwotICAgICZsdDthbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9IiZndDsKLSAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7c25pZmYtZm9sZGVyfSIvJmd0OwotICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLyZndDsKLSAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiCi0gICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnVpLnRlc3RzLlVpVGVzdFN1aXRlIi8mZ3Q7Ci0gICAgJmx0Oy9hbnQmZ3Q7Ci0gICZsdDsvdGFyZ2V0Jmd0OwotCi0gICZsdDshLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tJmd0OwotICAmbHQ7IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0mZ3Q7Ci0gICZsdDshLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLSZndDsKLSAgJmx0O3RhcmdldCBuYW1lPSJjbGVhbnVwIiZndDsKLSAgJmx0Oy90YXJnZXQmZ3Q7Ci0KLSAgJmx0OyEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tJmd0OwotICAmbHQ7IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0mZ3Q7Ci0gICZsdDt0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiJmd0OwotICAgICZsdDthbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9IiZndDsKLSAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8mZ3Q7Ci0gICAgICAmbHQ7cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLyZndDsKLSAgICAmbHQ7L2FudCZndDsKLSAgJmx0Oy90YXJnZXQmZ3Q7Ci0KLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPjwvY29kZT4KLTwvZm9udD4KLTxoMj5Lbm93biBJc3N1ZXM6PC9oMj4KLQotPGg0PlByb2JsZW0gMTogSXNzdWVzIHdpdGggQW50IDEuMzwvaDQ+Ci0KLTxwPkFudCAxLjMgaGFzIHNvbWUgaXNzdWVzIHdoZW4gdXNlZCB3aXRoIHRoZSAmbHQ7c3R5bGUmZ3Q7IHRhZyBhbmQgYWJzb2x1dGUKLXBhdGhzLiBBbHNvLCBhbnkgdGVzdHMgdGhhdCB1c2UgdGhlIDxjb2RlPlN5c3RlbS5leGl0KCk8L2NvZGU+IGNhbGwgd2lsbCBub3QKLWxvZyB0aGVpciBvdXRwdXQgcHJvcGVybHkgd2hlbiB1c2luZyBBbnQgMS4zLjwvcD4KLQotPGg0PlByb2JsZW0gMjogRUNMSVBTRV9IT01FPC9oND4KLQotPHA+VGhlIHRlc3Qgc3VpdGVzIG5lZWQgdG8ga25vdyB3aGVyZSB0aGUgcm9vdCBvZiB0aGUgZWNsaXBzZSBpbnN0YWxsIGlzIG9uIHRoZQotZmlsZSBzeXN0ZW0gKHRoZSBFQ0xJUFNFX0hPTUUgdmFyaWFibGUpLiBIb3dldmVyLCB0aGlzIHZhcmlhYmxlIGlzIG9ubHkgZGVmaW5lZAotaW4gSkRULiBUaGUgJHtlY2xpcHNlLWhvbWV9IHByb3BlcnR5IGNhbiBiZSBzZXQgdG8gYSByZWFzb25hYmxlIGRlZmF1bHQgaW5zaWRlCi1vZiB0aGUgdGVzdC54bWwgc2NyaXB0LiBUaGVuIHRlc3RzIGNhbiBiZSBydW4gZnJvbSB0aGUgc3RhbmRhcmQgQW50IHdpbmRvdywKLXdpdGhvdXQgaGF2aW5nIHRvIHNwZWNpZnkgLURlY2xpcHNlLWhvbWU9JUVDTElQU0VfSE9NRSUuIElmIGEgdmFsdWUgZm9yCi0ke2VjbGlwc2UtaG9tZX0gZG9lcyBnZXQgcGFzc2VkIGluLCB0aGUgZGVmYXVsdCAoc3BlY2lmaWVkIGluIHRlc3QueG1sKSBnZXRzCi1vdmVycmlkZGVuLiBUaGUgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiBieSB0aGUgYnVpbGQgbWVjaGFuaXNtLiBGb3IgbW9zdCBjYXNlcywKLXRoZSB2YWx1ZSAmcXVvdDske2Jhc2VkaXJ9Ly4uLy4uJnF1b3Q7IGlzIGEgcmVhc29uYWJsZSBkZWZhdWx0LjwvcD4KLQotPGg0PlByb2JsZW0gMzogVWdseSByZWZlcmVuY2UgdG8gbGlicmFyeS54bWw8L2g0PgotCi08cD5vcmcuZWNsaXBzZS50ZXN0IHNob3VsZCBwcm92aWRlIEFudCB0YXNrcywgbm90IHRlbXBsYXRlIHNjcmlwdHMuPC9wPgotCi08aDQ+UHJvYmxlbSA0OiBObyBjb25zb2xlIG91dHB1dDwvaDQ+Ci0KLTxwPldoZW4geW91IHJ1biBhIFRlc3RTdWl0ZSB1c2luZyB0aGUgc3RhbmRhcmQgSlVuaXQsIGl0IG5vcm1hbGx5IG91dHB1dHMgYQotc2VyaWVzIG9mIGRvdHMgdG8gdGhlIGNvbnNvbGUgc28gdGhhdCB5b3UgY2FuIHRyYWNrIHRoZSBUZXN0U3VpdGUncyBwcm9ncmVzcy4KLUl0IGlzIG5vdCBwb3NzaWJsZSB0byBhZGQgdGhpcyBmZWF0dXJlIHRvIHRoZSBhdXRvbWF0ZWQgdGVzdGluZyBwcm9jZXNzIGF0IHRoaXMKLXBvaW50IGluIHRpbWUuPC9wPgotCi08aDQ+UHJvYmxlbSA1OiBBbnQgamF2YSB0YXNrIG9uIExpbnV4PC9oND4KLQotPHA+QW50IGV4cGVjdHMgdGhlcmUgdG8gYmUgYSBqYXZhIGV4ZWN1dGFibGUgb24gdGhlIHN5c3RlbSBwYXRoLiBGdXJ0aGVybW9yZSwgdGhlIGV4ZWN1dGFibGUKLW11c3QgYmUgYSByZWFsIGZpbGUsIG5vdCBhIHN5bWJvbGljIGxpbmsuIElmIHRoZSB0ZXN0IGZyYW1ld29yayBpcyB0aHJvd2luZyBhbiBleGNlcHRpb24KLTxjb2RlPmphdmEuaW8uSU9FeGNlcHRpb246IGphdmE6IG5vdCBmb3VuZDwvY29kZT4sIGVuc3VyZSB0aGF0IHRoZSBqYXZhIGV4ZWN1dGFibGUgaXMgb24KLXlvdXIgc3lzdGVtIHBhdGguPC9wPgotCi08aDQ+UHJvYmxlbSA2OiBQREU8L2g0PgotPHA+VGhlIHRlc3RpbmcgZnJhbWV3b3JrIGN1cnJlbnRseSBoYXMgbm8ga25vd2xlZGdlIG9mIFBERS4gSW4gb3JkZXIgdG8gcnVuIHRoZSBhdXRvbWF0ZWQKLXlvdSBtdXN0IGJlIHJ1bm5pbmcgYSBzZWxmIGhvc3RpbmcgZW52aXJvbm1lbnQgd2l0aCBhIGZ1bGwgZGV2ZWxvcG1lbnQgYW5kIHRhcmdldCBFY2xpcHNlLjwvcD4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3AvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OTBlNjIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucmNwPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzZTA5My4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLXJvb3Q9Li4vb3JnLmVjbGlwc2UucGxhdGZvcm0vcm9vdGZpbGVzLGZpbGU6Li4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9zdGFydHVwLmphcixyb290ZmlsZXMKLXJvb3QucGVybWlzc2lvbnMuNzU1PWVjbGlwc2UKLQotcm9vdC53aW4zMi53aW4zMi54ODY9Li4vLi4vcGx1Z2lucy9wbGF0Zm9ybS1sYXVuY2hlci9iaW4vd2luMzIKLQotcm9vdC5haXgubW90aWYucHBjPS4uLy4uL3BsdWdpbnMvcGxhdGZvcm0tbGF1bmNoZXIvYmluL2FpeAotCi1yb290LmhwdXgubW90aWYuUEFfUklTQz0uLi8uLi9wbHVnaW5zL3BsYXRmb3JtLWxhdW5jaGVyL2Jpbi9ocHV4L1BBX1JJU0MKLQotcm9vdC5zb2xhcmlzLm1vdGlmLnNwYXJjPS4uLy4uL3BsdWdpbnMvcGxhdGZvcm0tbGF1bmNoZXIvYmluL3NvbGFyaXMKLQotcm9vdC5saW51eC5ndGsueDg2PS4uLy4uL3BsdWdpbnMvcGxhdGZvcm0tbGF1bmNoZXIvYmluL2xpbnV4L2d0awotcm9vdC5saW51eC5ndGsuYW1kNjQ9Li4vLi4vcGx1Z2lucy9wbGF0Zm9ybS1sYXVuY2hlci9iaW4vbGludXgvZ3RrNjQKLSMgTmVlZCB0byBiZSBmaXhlZCB0byByZWZsZWN0IGV2ZW50dWFsIGNoYW5nZSBpbnRvIGZlYXR1cmUueG1sCi1yb290LnFueC5waG90b24ueDg2PS4uLy4uL3BsdWdpbnMvcGxhdGZvcm0tbGF1bmNoZXIvYmluL3Bob3RvbgotCi1yb290LmxpbnV4Lm1vdGlmLng4Nj0uLi8uLi9wbHVnaW5zL3BsYXRmb3JtLWxhdW5jaGVyL2Jpbi9saW51eC9tb3RpZiwuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9saW51eC5tb3RpZgotcm9vdC5saW51eC5tb3RpZi54ODYubGluaz1saWJYbS5zby4yLjEsbGliWG0uc28uMixsaWJYbS5zby4yLjEsbGliWG0uc28KLXJvb3QubGludXgubW90aWYueDg2LnBlcm1pc3Npb25zLjc1NT0qLnNvKgotCi1yb290Lm1hY29zeC5jYXJib24ucHBjPS4uL29yZy5lY2xpcHNlLnBsYXRmb3JtL21hY29zeC5jYXJib24sLi4vLi4vcGx1Z2lucy9wbGF0Zm9ybS1sYXVuY2hlci9iaW4vbWFjb3N4Ci1yb290Lm1hY29zeC5jYXJib24ucHBjLmxpbms9RWNsaXBzZS5hcHAvQ29udGVudHMvTWFjT1MvZWNsaXBzZSxlY2xpcHNlCi1yb290Lm1hY29zeC5jYXJib24ucHBjLnBlcm1pc3Npb25zLjc1NT1FY2xpcHNlLmFwcC9Db250ZW50cy9NYWNPUy9lY2xpcHNlLEVjbGlwc2UuYXBwL0NvbnRlbnRzL01hY09TL2phdmFfc3d0Ci0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcC9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkYjZhZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3AvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucmNwIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4xIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gIDwhLS0gV2luMzIgLS0+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC53aW4zMiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIwLjAuMCIgZnJhZ21lbnQ9InRydWUiIHdzPSJ3aW4zMiIvPgotCi0gIDwhLS0gTElOVVggR1RLIC0tPiAgCi0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMC4wLjAiICBmcmFnbWVudD0idHJ1ZSIgb3M9ImxpbnV4IiB3cz0iZ3RrIi8+Ci0KLSAgPCEtLSBMSU5VWCBHVEsgQU1ENjQtLT4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0azY0IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjAuMC4wIiAgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIgd3M9Imd0ayIgYXJjaD0iYW1kNjQiIC8+Ci0KLSAgPCEtLSBNYWNPUyBYIENhcmJvbiAtLT4gIAotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuY2FyYm9uIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjAuMC4wIiAgZnJhZ21lbnQ9InRydWUiIG9zPSJtYWNvc3giIHdzPSJjYXJib24iLz4gCi0gIAotICA8IS0tIEFJWCBNb3RpZiAtLT4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm1vdGlmIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjAuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9ImFpeCIgd3M9Im1vdGlmIi8+Ci0gIAotICA8IS0tIEhQVVggTW90aWYgLS0+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIwLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJocHV4IiB3cz0ibW90aWYiLz4KLQotICA8IS0tIExJTlVYIE1vdGlmIC0tPiAgICAKLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm1vdGlmIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjAuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9ImxpbnV4IiB3cz0ibW90aWYiLz4KLQotICA8IS0tIFNvbGFyaXMgTW90aWYgLS0+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIwLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJzb2xhcmlzIiB3cz0ibW90aWYiLz4KLSAgCi0gIDwhLS0gUU5YIFBob3RvbiAtLT4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0LnBob3RvbiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIwLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJxbngiIHdzPSJwaG90b24iLz4KLSAgCi08L2ZlYXR1cmU+Ci0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcC9yb290ZmlsZXMvY29uZmlndXJhdGlvbi9jb25maWcuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwL3Jvb3RmaWxlcy9jb25maWd1cmF0aW9uL2NvbmZpZy5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NzdiMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwL3Jvb3RmaWxlcy9jb25maWd1cmF0aW9uL2NvbmZpZy5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jIEVjbGlwc2UgcnVudGltZSBjb25maWd1cmF0aW9uIGZpbGUNCi0jIFRoaXMgZmlsZSBjb250YWlucyBhIG51bWJlciBvZiBrZXkvdmFsdWUgcGFpcnMgdGhhdCBhcmUgbWVyZ2VkIGludG8gdGhlIA0KLSMgU3lzdGVtIHByb3BlcnRpZXMgb24gc3lzdGVtIHN0YXJ0dXAuICBUaGUgdmFsdWVzIGNvbnRyb2wgdGhlIHdheSB0aGUgDQotIyBydW50aW1lIGlzIHN0cnVjdHVyZWQgYW5kIHJ1bnMuDQotDQotIyBOb3RlOiAgT25seSBwbGF0Zm9ybTovYmFzZS8gYW5kIGZpbGU6IFVSTHMgYXJlIHN1cHBvcnRlZC4gIEluIGdlbmVyYWwgdGhlIA0KLSMgVVJMcyBnaXZlbiBtYXkgaW5jbHVkZSBhIHZlcnNpb24gbnVtYmVyIChlLmcuLCAuLi4vbG9jYXRpb25fMS4yLjMpLiAgDQotIyBJZiBhIHZlcnNpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIHN5c3RlbSBiaW5kcw0KLSMgdG8gdGhlIGxvY2F0aW9uIHdoaWNoIG1hdGNoZXMgZXhhY3RseSBvciB0byB0aGUgdmVyc2lvbmVkIGxvY2F0aW9uIHdpdGggdGhlDQotIyBsYXRlc3QgdmVyc2lvbiBudW1iZXIuICBJZiBhIHZlcnNpb24gbnVtYmVyIGlzIGdpdmVuIHRoZW4gb25seSBleGFjdCBtYXRjaGVzDQotIyBhcmUgY29uc2lkZXJlZC4NCi0NCi0jIFRoZSBVUkwgZm9yIHRoZSBydW50aW1lIGVudHJ5IHBvaW50LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMNCi0jIHBsYXRmb3JtOi9iYXNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaSANCi0jb3NnaS5mcmFtZXdvcms9cGxhdGZvcm06L2Jhc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5vc2dpDQotDQotIyBUaGUgY2xhc3NwYXRoIGZvciB0aGUgZnJhbWV3b3JrIGZvdW5kIGF0IHRoZSBvc2dpLmZyYW1ld29yayBsb2NhdGlvbi4gIFRoaXMgDQotIyBjb21tYS1zZXBhcmF0ZWQgbGlzdCBjb250YWlucyBlaXRoZXIgVVJMcyBvciBzaW1wbGUgZWxlbWVudCBuYW1lcy4gIFNpbXBsZQ0KLSMgbmFtZXMgYXJlIGFzc3VtZWQgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGZyYW1ld29yaydzIGluc3RhbGwgZGlyZWN0b3J5LiAgDQotIyBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBuZWVkIG5vdCBiZSBzZXQgYXMgaXQgaXMgaW5pdGlhbGl6ZWQgYnkgdGhlIGZyYW1ld29yayBpdHNlbGYuDQotIyBWZXJzaW9uIG1hdGNoIHNlYXJjaGluZyBpcyBub3QgZG9uZSBmb3IgVVJMcyBsaXN0ZWQgaGVyZS4NCi0jb3NnaS5mcmFtZXdvcmtDbGFzc1BhdGggPQ0KLQ0KLSMgVGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxvY2F0aW9ucyB0byBzZWFyY2ggZm9yIHRoZSBzcGxhc2ggc2NyZWVuIGZpbGUgKHNwbGFzaC5ibXApLg0KLSMgRm9yIGVhY2ggbGlzdCBlbGVtZW50IGEgc3ViZGlyZWN0b3J5IHN0cnVjdHVyZSBiYXNlZCBvbiB0aGUgcGF0dGVybiBubC88bG9jYWxlPiBpcyBzZWFyY2hlZC4NCi0jIFRoZSBzeXN0ZW0gYmluZHMgdG8gdGhlIGZpcnN0IG1hdGNoaW5nIGZpbGUuICBUaGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLg0KLSNvc2dpLnNwbGFzaFBhdGg9DQotDQotIyBUaGUgbG9jYXRpb24gb2YgdGhlIHNwbGFzaCBzY3JlZW4gZmlsZS4gIElmIHRoaXMgdmFsdWUgaXMgc2V0IGF0IHN5c3RlbSBzdGFydHVwIGl0IGlzIHVzZWQgDQotIyBpbiBmYXZvdXIgb2YgdGhlIG9zZ2kuc3BsYXNoUGF0aCBzZWFyY2hpbmcgb3V0bGluZWQgYWJvdmUuICBJZiB0aGUgdmFsdWUgaXMgbm90IHNldCANCi0jIHRoZSBzZWFyY2hpbmcgaXMgZG9uZSBhbmQgdGhpcyBrZXkgaXMgYm91bmQgdG8gdGhlIHJlc3VsdCBvZiB0aGUgc2VhcmNoLg0KLSNvc2dpLnNwbGFzaExvY2F0aW9uID0NCi0NCi0jIFRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBidW5kbGVzIHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCBhbmQgb3B0aW9uYWxseSBzdGFydGVkDQotIyBvbmNlIHRoZSBzeXN0ZW0gaXMgdXAgYW5kIHJ1bm5pbmcuICBFYWNoIGVudHJ5IGlmIG9mIHRoZSBmb3JtDQotIyAgICAgPFVSTCB8IHNpbXBsZSBidW5kbGUgbG9jYXRpb24+W0AgWzxzdGFydGxldmVsPl0gWyI6c3RhcnQiXV0NCi0jIElmIHRoZSBzdGFydGxldmVsIGlzIG9taXR0ZWQgdGhlbiB0aGUgZnJhbWV3b3JrIHdpbGwgdXNlIHRoZSBkZWZhdWx0IHN0YXJ0IGxldmVsIGZvciB0aGUgYnVuZGxlLg0KLSMgSWYgdGhlICJzdGFydCIgdGFnIGlzIGFkZGVkIHRoZW4gdGhlIGJ1bmRsZSB3aWxsIGJlIG1hcmtlZCBhcyBzdGFydGVkIGFmdGVyIGJlaW5nIGluc3RhbGxlZC4NCi0jIFNpbXBsZSBidW5kbGUgbG9jYXRpb25zIGFyZSBpbnRlcmVwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIGZyYW1ld29yaydzIHBhcmVudCBkaXJlY3RvcnkuDQotIyBUaGUgc3RhcnRsZXZlbCBpbmRpY2F0ZXMgdGhlIE9TR2kgc3RhcnQgbGV2ZWwgYXQgd2hpY2ggdGhlIGJ1bmRsZSBzaG91bGQgcnVuLg0KLSMgSWYgdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCB0aGUgc3lzdGVtIGNvbXB1dGVzIGFuIGFwcHJvcHJpYXRlIGRlZmF1bHQuDQotb3NnaS5idW5kbGVzPW9yZy5lY2xpcHNlLmNvcmUucnVudGltZUAyOnN0YXJ0DQotDQotIyBUaGUgcHJvZHVjdCB0byBydW4uICBBIGdpdmVuIEVjbGlwc2UgY29uZmlndXJhdGlvbiBtYXkgY29udGFpbiBtYW55IHByb2R1Y3RzLg0KLSMgVGhlIHByb2R1Y3QgaWRlbnRpZmllZCB3aWxsIHN1cHBseSB0aGUgYnJhbmRpbmcgKHdpbmRvdyBpY29ucywgdGl0bGUgYmFyIHRleHQpIGV0YyANCi0jIGFzIHdlbGwgYXMgZGVmaW5lIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIHRvIHJ1bi4gIA0KLSNlY2xpcHNlLnByb2R1Y3Q9DQotDQotIyBUaGUgYXBwbGljYXRpb24gdG8gcnVuLiAgVGhlIHZhbHVlIHNwZWNpZmllZCBoZXJlIGlzIHRoZSBpZCBvZiB0aGUgYXBwbGljYXRpb24gZXh0ZW5zaW9uDQotIyB0aGUgcnVudGltZSB3aWxsIGZpbmQsIGluc3RhbnRpYXRlIGFuZCBleGVjdXRlIG9uY2UgdGhlIHN5c3RlbSBpcyB1cC4gIE5vdGUgdGhhdCB0eXBpY2FsbHkgDQotIyB0aGUgaWRlbnRpZmllZCBlY2xpcHNlLnByb2R1Y3QgZGVmaW5lcyB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0byBydW4uDQotI2VjbGlwc2UuYXBwbGljYXRpb249DQotDQotIyBUaGUgYnVpbGQgaWRlbnRpZmllcg0KLWVjbGlwc2UuYnVpbGRJZD1AYnVpbGRADQotDQotIyBFbmQgb2YgZmlsZSBtYXJrZXIgLSBtdXN0IGJlIGhlcmUNCi1lb2Y9ZW9mClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxNmYxMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YzRkNTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWNwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKLQotZ2VuZXJhdGUucGx1Z2luQG9yZy5lY2xpcHNlLnNkay5leGFtcGxlcy5zb3VyY2U9b3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzCi0KLXJvb3Q9cm9vdGZpbGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvY3BsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFhMjA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL2NwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9USVRMRT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+Ci0KLQotPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Ci08UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLQotPC9CT0RZPgotCi08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTNlMDIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmMGM0Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFNESyBFeGFtcGxlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUVjbGlwc2UgU0RLIGV4YW1wbGVzLiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggRWNsaXBzZSBQcm9qZWN0IFNESy4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLTE1dGggSnVuZSwgMjAwNFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLUVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzXG5cCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yXG5cCi1tb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGVcblwKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50c1xuXAotYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpblxuXAotZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkYTViNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotCSAgaWQ9Im9yZy5lY2xpcHNlLnNkay5leGFtcGxlcyIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMSIKLSAgICAgIGltYWdlPSAiZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotICAgICAgCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdCIgdmVyc2lvbj0iMy4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucGxhdGZvcm0iIHZlcnNpb249IjMuMC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzIiB2ZXJzaW9uPSIwLjAuMCIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLnNvdXJjZSIgdmVyc2lvbj0iMC4wLjAiLz4KLSAgIDxwbHVnaW4gZnJhZ21lbnQ9InRydWUiIGlkPSJvcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMuc291cmNlLndpbjMyLndpbjMyLng4NiIgb3M9IndpbjMyIiB3cz0id2luMzIiIGFyY2g9Ing4NiIgdmVyc2lvbj0iMC4wLjAiLz4KLSAgIAotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcyIgdmVyc2lvbj0iMC4wLjAiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sIiB2ZXJzaW9uPSIwLjAuMCIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuaGVscC5leGFtcGxlcy5leDEiIHZlcnNpb249IjAuMC4wIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZHQudWkuZXhhbXBsZXMucHJvamVjdHMiIHZlcnNpb249IjAuMC4wIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiIHZlcnNpb249IjAuMC4wIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlciIgdmVyc2lvbj0iMC4wLjAiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scyIgdmVyc2lvbj0iMC4wLjAiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlciIgdmVyc2lvbj0iMC4wLjAiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzIiB2ZXJzaW9uPSIwLjAuMCIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50IiB2ZXJzaW9uPSIwLjAuMCIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuamF2YWVkaXRvciIgdmVyc2lvbj0iMC4wLjAiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLm11bHRpcGFnZWVkaXRvciIgdmVyc2lvbj0iMC4wLjAiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLnByb3BlcnR5c2hlZXQiIHZlcnNpb249IjAuMC4wIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5yZWFkbWV0b29sIiB2ZXJzaW9uPSIwLjAuMCIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudGVhbS5leGFtcGxlcy5maWxlc3lzdGVtIiB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyIiB2ZXJzaW9uPSIwLjAuMCIgd3M9IndpbjMyIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkODUwMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+MTU8c3VwPnRoPC9zdXA+IEp1bmUsIDIwMDQ8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3Jvb3RmaWxlcy9jcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9yb290ZmlsZXMvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFhMjA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3Jvb3RmaWxlcy9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3Jvb3RmaWxlcy9ub3RpY2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3Jvb3RmaWxlcy9ub3RpY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkODUwMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9yb290ZmlsZXMvbm90aWNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+MTU8c3VwPnRoPC9zdXA+IEp1bmUsIDIwMDQ8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRnJhZ21lbnQvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRnJhZ21lbnQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1NGU3MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZyYWdtZW50L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD4yMHRoIEp1bmUsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgQ1BMLjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRnJhZ21lbnQvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGcmFnbWVudC9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZmU0ZmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGcmFnbWVudC9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIGFib3V0LmluaQ0KLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpDQotYWJvdXRUZXh0PSVibHVyYg0KLQ0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikNCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5DQotDQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQ0KLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmDQotDQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpDQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQ0KLQ0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQ0KLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkNCi0NCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkNCi0jIG9wdGlvbmFsDQotDQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQ0KLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4NCi0jIG9wdGlvbmFsDQotDQotDQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGcmFnbWVudC9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRnJhZ21lbnQvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMGNhODcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGcmFnbWVudC9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRnJhZ21lbnQvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRnJhZ21lbnQvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllZDYyNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZyYWdtZW50L2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RWNsaXBzZSBTREsgRXhhbXBsZXNcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IElCTSBDb3JwLiBhbmQgb3RoZXJzIDIwMDAsIDIwMDQuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRnJhZ21lbnQvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRnJhZ21lbnQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlZjcyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZyYWdtZW50L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgZWNsaXBzZTMyLmdpZiwgcGx1Z2luLnByb3BlcnRpZXMsIGZyYWdtZW50LnhtbCwgc3JjLyoqCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZyYWdtZW50L2VjbGlwc2UzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZyYWdtZW50L2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MWE4ZjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGcmFnbWVudC9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGcmFnbWVudC9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRnJhZ21lbnQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NGMxZTcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGcmFnbWVudC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUVjbGlwc2UgSmF2YSBEZXZlbG9wbWVudCBUb29scyBTREsKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWM0NjJhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZWNsaXBzZTMyLmdpZiwgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKgotCi1zb3VyY2VQbHVnaW4gPSB0cnVlCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzFhOGY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjdhMGEyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay5leGFtcGxlcy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9RWNsaXBzZSBQbGF0Zm9ybSBQbHVnLWluIERldmVsb3BlciBSZXNvdXJjZXMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI3OTRiMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zZGsudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDA4N2Q2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotY3BsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbAotCi0KLWdlbmVyYXRlLnBsdWdpbkBvcmcuZWNsaXBzZS5zZGsudGVzdHMuc291cmNlPW9yZy5lY2xpcHNlLnNkay50ZXN0cwotCi1yb290PXJvb3RmaWxlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9jcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFhMjA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTNlMDIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNmOGQ2ZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBTREsgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2Uub3JnIHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1FY2xpcHNlIFNESyBleGFtcGxlcy4gVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEVjbGlwc2UgUHJvamVjdCBTREsuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UuT1JHIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi0xNXRoIEp1bmUsIDIwMDRcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZ1xuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLUNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50c1xuXAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvclxuXAotbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlXG5cCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHNcblwKLWFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW5cblwKLWRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gU3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllYTI2OS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0JICBpZD0ib3JnLmVjbGlwc2Uuc2RrLnRlc3RzIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4xIgotICAgICAgaW1hZ2U9ICJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0gICAgICAKLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlCi0gICAgICAgICB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcyIKLSAgICAgICAgIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiPgotICAgICAgPC91cGRhdGU+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc2RrLnRlc3RzIiB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8IS0tICBBbnQgdGVzdCBwbHVnaW5zICAtLT4KLQotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUiIHZlcnNpb249IjAuMC4wIiAvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpIiB2ZXJzaW9uPSIwLjAuMCIgLz4KLQotICAgPCEtLSAgQ29yZSB0ZXN0IHBsdWdpbnMgIC0tPgotCi0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLmhhcm5lc3MiIHZlcnNpb249IjAuMC4wIiAvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uub3NnaS50ZXN0cyIgdmVyc2lvbj0iMC4wLjAiIC8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnRlc3RzLnJ1bnRpbWUiIHZlcnNpb249IjAuMC4wIiAvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS50ZXN0cy5yZXNvdXJjZXMiIHZlcnNpb249IjAuMC4wIiAvPgotCi0gICA8IS0tICBKRFQgQ29yZSB0ZXN0IHBsdWdpbnMgIC0tPgotCi0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyIiB2ZXJzaW9uPSIwLjAuMCIgLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyIiB2ZXJzaW9uPSIwLjAuMCIgLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsIiB2ZXJzaW9uPSIwLjAuMCIgLz4KLQotICA8IS0tICBKRFQgRGVidWcgdGVzdCBwbHVnaW5zICAtLT4KLQotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamR0LmRlYnVnLnRlc3RzIiB2ZXJzaW9uPSIwLjAuMCIgLz4KLSAKLQotICAgPCEtLSAgSGVscCB0ZXN0IHBsdWdpbiAgLS0+Ci0KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmhlbHAudGVzdHMiIHZlcnNpb249IjAuMC4wIiAvPgotCi0KLSAgIDwhLS0gIEpEVCBVSSB0ZXN0IHBsdWdpbnMgIC0tPgotCi0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZHQudWkudGVzdHMiIHZlcnNpb249IjAuMC4wIiAvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLnRlc3RzLnJlZmFjdG9yaW5nIiB2ZXJzaW9uPSIwLjAuMCIgLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMudGVzdHMiIHZlcnNpb249IjAuMC4wIiAvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcudGVzdHMiIHZlcnNpb249IjAuMC4wIiAvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLnRlc3RzIiB2ZXJzaW9uPSIwLjAuMCIgLz4KLQotCi0gICA8IS0tICBUZXh0IHRlc3QgcGx1Z2lucyAgLS0+Ci0KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnRleHQudGVzdHMiIHZlcnNpb249IjAuMC4wIiAvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZXN0cyIgdmVyc2lvbj0iMC4wLjAiIC8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLnRlc3RzIiB2ZXJzaW9uPSIwLjAuMCIgLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpkdC50ZXh0LnRlc3RzIiB2ZXJzaW9uPSIwLjAuMCIgLz4KLQotCi0gICA8IS0tICBTV1QgdGVzdCBwbHVnaW4gIC0tPgotCi0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QudGVzdHMiIHZlcnNpb249IjAuMC4wIiAvPgotCi0KLSAgIDwhLS0gIFVJIHRlc3QgcGx1Z2luICAtLT4KLQotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkudGVzdHMiIHZlcnNpb249IjAuMC4wIiAvPgotCi0KLSAgIDwhLS0gIFVwZGF0ZSB0ZXN0IHBsdWdpbiAgLS0+Ci0KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlIiB2ZXJzaW9uPSIwLjAuMCIgLz4KLQotICAgPCEtLSAgUmVsZW5nIHRlc3QgcGx1Z2luICAtLT4KLQotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UucmVsZW5nLnRlc3RzIiB2ZXJzaW9uPSIwLjAuMCIgLz4KLQotICAgPCEtLSAgVGVhbSB0ZXN0IHBsdWdpbnMgIC0tPgotCi0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS50ZWFtLnRlc3RzLmN2cy5jb3JlIiB2ZXJzaW9uPSIwLjAuMCIgLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnRlYW0udGVzdHMuY29yZSIgdmVyc2lvbj0iMC4wLjAiIC8+Ci0gICAKLSAgIDwhLS0gIFBlcmZvcm1hbmNlIGZyYW1ld29yayBwbHVnaW5zICAtLT4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZSIgdmVyc2lvbj0iMC4wLjAiIC8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUud2luMzIiIHZlcnNpb249IjAuMC4wIiAvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UucGVyZm1zci51aSIgdmVyc2lvbj0iMC4wLjAiIC8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5wZXJmbXNyLnVpLmNsaWVudCIgdmVyc2lvbj0iMC4wLjAiIC8+Ci0gICAKLSAgIAotICAgPCEtLSAgVGVzdCBmcmFtZXdvcmsgcGx1Z2lucyAgLS0+Ci0KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnRlc3QiIHZlcnNpb249IjAuMC4wIiAvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0IiB2ZXJzaW9uPSIwLjAuMCIgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc2RrLnRlc3RzLnNvdXJjZSIgdmVyc2lvbj0iMC4wLjAiLz4KLSAgIAotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDg1MDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD4xNTxzdXA+dGg8L3N1cD4gSnVuZSwgMjAwNDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLSAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KLSAgCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0gIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL3Jvb3RmaWxlcy9jcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvcm9vdGZpbGVzL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhYTIwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsudGVzdHMvcm9vdGZpbGVzL2NwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9USVRMRT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+Ci0KLQotPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Ci08UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLQotPC9CT0RZPgotCi08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL3Jvb3RmaWxlcy9ub3RpY2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay50ZXN0cy9yb290ZmlsZXMvbm90aWNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDg1MDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLnRlc3RzL3Jvb3RmaWxlcy9ub3RpY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD4xNTxzdXA+dGg8L3N1cD4gSnVuZSwgMjAwNDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLSAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KLSAgCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0gIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTQ5OGMyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnNkazwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiODBmYjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzPWNwbC12MTAuaHRtbCxlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLGZlYXR1cmUueG1sLGZlYXR1cmUucHJvcGVydGllcyxsaWNlbnNlLmh0bWwKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2U9b3JnLmVjbGlwc2UucGxhdGZvcm0sIHBsdWdpbkBvcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MuaXN2Ci1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpkdC5zb3VyY2U9b3JnLmVjbGlwc2UuamR0LCBwbHVnaW5Ab3JnLmVjbGlwc2UuamR0LmRvYy5pc3YKLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UucGRlLnNvdXJjZT1vcmcuZWNsaXBzZS5wZGUKLQotcm9vdD0uLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9yb290ZmlsZXMsLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0vY29uZmlndXJhdGlvbi5maWxlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay9jcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFhMjA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTNlMDIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2ZDI5YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQcm9qZWN0IFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNESyBmb3IgRWNsaXBzZS4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLTE1dGggSnVuZSwgMjAwNFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLUVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzXG5cCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yXG5cCi1tb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGVcblwKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50c1xuXAotYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpblxuXAotZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDEyZGY1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnNkayIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMSIKLSAgICAgIGltYWdlPSAiZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0gICAKLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0gICA8L3VybD4KLQotICA8aW5jbHVkZXMgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIiB2ZXJzaW9uPSIwLjAuMCIgLz4gCi0gIDxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlIiB2ZXJzaW9uPSIwLjAuMCIgLz4gCi0gIDxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UuamR0IiB2ZXJzaW9uPSIwLjAuMCIgLz4KLSAgPGluY2x1ZGVzIGlkPSJvcmcuZWNsaXBzZS5qZHQuc291cmNlIiB2ZXJzaW9uPSIwLjAuMCIgLz4gCi0gIDxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UucGRlIiB2ZXJzaW9uPSIwLjAuMCIgLz4gCi0gIDxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UucGRlLnNvdXJjZSIgdmVyc2lvbj0iMC4wLjAiIC8+IAotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zZGsiIHZlcnNpb249IjAuMC4wIi8+Ci0gIAotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGsvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Q4NTAwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+MTU8c3VwPnRoPC9zdXA+IEp1bmUsIDIwMDQ8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4K